[解決済み] ディレクティブコントローラ内のメソッドを他のコントローラから呼び出す
質問
独自のコントローラを持つディレクティブがあります。以下のコードを見てください。
var popdown = angular.module('xModules',[]);
popdown.directive('popdown', function () {
var PopdownController = function ($scope) {
this.scope = $scope;
}
PopdownController.prototype = {
show:function (message, type) {
this.scope.message = message;
this.scope.type = type;
},
hide:function () {
this.scope.message = '';
this.scope.type = '';
}
}
var linkFn = function (scope, lElement, attrs, controller) {
};
return {
controller: PopdownController,
link: linkFn,
replace: true,
templateUrl: './partials/modules/popdown.html'
}
});
これは、エラー/通知/警告のための通知システムであることを意味します。私がやりたいことは、別のコントローラ(ディレクティブではない)から、関数
show
をこのコントローラ上で呼び出すことです。そして、その際に、私のリンク関数が、いくつかのプロパティが変更されたことを検出し、いくつかのアニメーションを実行することも望んでいます。
以下は、私が求めていることを例証するためのコードです。
var app = angular.module('app', ['RestService']);
app.controller('IndexController', function($scope, RestService) {
var result = RestService.query();
if(result.error) {
popdown.notify(error.message, 'error');
}
});
ですから
show
を呼び出すと
popdown
ディレクティブコントローラで、リンク関数もトリガーされ、アニメーションが実行される必要があります。どうすればそれを実現できるでしょうか?
どのように解決するのですか?
これは興味深い質問で、私はこのようなものをどのように実装するかについて考え始めました。
私が思いついたのは これ(フィドル) ;
基本的に、コントローラからディレクティブを呼び出そうとするのではなく、すべてのポップダウンロジックを格納するモジュールを作成しました。
var PopdownModule = angular.module('Popdown', []);
モジュールに2つの
factory
と、どこにでも注入できる API のための
directive
で実際のポップダウン要素の振る舞いを定義しています。
ファクトリーは単にいくつかの関数を定義しています
success
と
error
で、いくつかの変数を記録しています。
PopdownModule.factory('PopdownAPI', function() {
return {
status: null,
message: null,
success: function(msg) {
this.status = 'success';
this.message = msg;
},
error: function(msg) {
this.status = 'error';
this.message = msg;
},
clear: function() {
this.status = null;
this.message = null;
}
}
});
このディレクティブはAPIをコントローラにインジェクトし、APIの変更を監視します(便宜上、bootstrap cssを使用しています)。
PopdownModule.directive('popdown', function() {
return {
restrict: 'E',
scope: {},
replace: true,
controller: function($scope, PopdownAPI) {
$scope.show = false;
$scope.api = PopdownAPI;
$scope.$watch('api.status', toggledisplay)
$scope.$watch('api.message', toggledisplay)
$scope.hide = function() {
$scope.show = false;
$scope.api.clear();
};
function toggledisplay() {
$scope.show = !!($scope.api.status && $scope.api.message);
}
},
template: '<div class="alert alert-{{api.status}}" ng-show="show">' +
' <button type="button" class="close" ng-click="hide()">×</button>' +
' {{api.message}}' +
'</div>'
}
})
次に
app
モジュールに依存する
Popdown
:
var app = angular.module('app', ['Popdown']);
app.controller('main', function($scope, PopdownAPI) {
$scope.success = function(msg) { PopdownAPI.success(msg); }
$scope.error = function(msg) { PopdownAPI.error(msg); }
});
そして、HTMLは次のようになります。
<html ng-app="app">
<body ng-controller="main">
<popdown></popdown>
<a class="btn" ng-click="success('I am a success!')">Succeed</a>
<a class="btn" ng-click="error('Alas, I am a failure!')">Fail</a>
</body>
</html>
完全に理想的な方法かどうかはわかりませんが、グローバルな感じのポップダウンディレクティブとの通信を設定するには合理的な方法だと思われました。
もう一度、参考までに フィドル .
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] jQueryを使ってドロップダウンリスト(セレクトボックス)から選択されたテキストを取得する
-
[解決済み] JavaScriptでsetIntervalの呼び出しを停止する
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み] 親メソッドから子メソッドを呼び出す
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] javascript includes() 大文字小文字を区別しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】AngularJSディレクティブで定義されたメソッドを呼び出すには?
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?