おそらく、私はディレクティブ コントローラの動作について根本的な誤解をしているのでしょう。私の理解では、ディレクティブ コントローラは、他のディレクティブやコントローラに公開される一種の API として使用されます。コントローラとリンク関数が内部的に通信できるようにしたいと考えています。
たとえば、コントローラー関数を介して変数を設定し、それをリンク関数で使用できるようにしたいと考えています。
var app = angular.module('test-app', []);
app.directive('coolDirective', function () {
return {
controller: function () {
this.sayHi = function($scope, $element, $attrs) {
$scope.myVar = "yo"
}
},
link: function(scope, el, attrs) {
console.log(scope.myVar);
}
}
});
リンク関数内で myVar または sayHi にアクセスするにはどうすればよいでしょうか? それとも、要点を完全に見逃しているのでしょうか?
ベストアンサー1
コントローラーの $scope (関数ではなくコントローラーで定義されますsayHi
) とリンクは両方ともscope
同じです。コントローラーで何かを設定すると、リンクから使用できるようになります。またはその逆も同様です。
問題は、それがsayHi
決して実行されない関数であり、myVar
決して設定されないことです。
sayHi
はスコープ内にないため、コントローラーへの参照が必要であり、それを実行するには、次のように 4 番目のパラメーターを追加します。
link: function(scope, element, attr, ctrl) {}
次に、 を実行できますctrl.sayHi()
(ただし、 のパラメータはsayHi
コントローラー関数に属します)。
別のコントローラーが必要で、そのコントローラーのディレクティブも使用したい場合は、そのコントローラーも必要になります。そのため、coolDirective
コントローラーにアクセスする必要がある場合はnotCoolAtAll
、次のようにします。
require: ['coolDirective', 'notCoolAtAll']
これでうまくいきます。link
関数は 4 番目のパラメータとしてコントローラーの配列を受け取ります。この場合、最初の要素はcoolDirective
ctrl で、2 番目の要素はnotCoolAtAll
one になります。
ここに小さな例があります:http://plnkr.co/edit/JXahWE43H3biouygmnOX?p=preview