ディレクティブ間で通信する方法はかなりあるようです。ネストされたディレクティブがあるとします。ここでは、内側のディレクティブが外側に何かを伝える必要があります(たとえば、ユーザーによって選択されます)。
<outer>
<inner></inner>
<inner></inner>
</outer>
これまでにこれを行うには5つの方法があります
require:
親ディレクティブ
inner
ディレクティブが必要になることがありouter
、そのコントローラ上のいくつかのメソッドを公開することができディレクティブを、。だからinner
定義では
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
そして、outer
ディレクティブのコントローラーで:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
出来事
inner
ディレクティブができる$emit
イベント、outer
ディレクティブは経由して、に応答することができます$on
。そのため、inner
ディレクティブのコントローラーで:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
そして、でouter
ディレクティブコントローラ:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
経由で親スコープで式を実行する &
アイテムは親スコープ内の式にバインドし、適切な時点で実行できます。HTMLは次のようになります。
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
そのため、inner
コントローラーには呼び出すことができる「innerChoose」関数があります
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
outer
ディレクティブのスコープで(この場合) 'functionOnOuter'関数を呼び出します:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
非分離スコープでのスコープの継承
これらがネストされたコントローラーであることを考えると、スコープの継承が機能し、内部ディレクティブは、孤立したスコープを持たない限り、スコープチェーン内の任意の関数を呼び出すことができます)。中のSO inner
ディレクティブ:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
そしてouter
ディレクティブでは:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
内側と外側の両方に注入されたサービスにより
サービスは両方のディレクティブに挿入できるため、同じオブジェクトに直接アクセスしたり、関数を呼び出してサービスに通知したり、場合によってはpub / subシステムで通知されるように登録することもできます。これには、ディレクティブをネストする必要はありません。
質問:他のものに対するそれぞれの潜在的な欠点と利点は何ですか?