Angular の世界と非 Angular の世界の間の相互作用を理解しようとしています。
次のように宣言するディレクティブがあるとします。
<dir1 id="d1" attr1="100"/>
angular 外のコードがディレクティブを次のように変更する場合:
$("#d1").attr("attr1", 1000);
ディレクティブは、その属性の 1 つが変更されたことをどのように知ることができますか?
Angular の世界と非 Angular の世界の間の相互作用を理解しようとしています。
次のように宣言するディレクティブがあるとします。
<dir1 id="d1" attr1="100"/>
angular 外のコードがディレクティブを次のように変更する場合:
$("#d1").attr("attr1", 1000);
ディレクティブは、その属性の 1 つが変更されたことをどのように知ることができますか?
代わりに、この変更をディレクティブ内で行うのが最善です。何らかの理由でそれが不可能な場合は、いくつかのオプションがあります。
アプリの外部で、アプリ内の任意の DOM 要素への参照を取得します。その参照を使用して、そのスコープへの参照を取得できます。要素を id で使用できますd1
。例えば:
var domElement = document.getElementById('d1');
var scope = angular.element(domElement).scope();
以下にいくつかのオプションを示します。
ビューを直接変更するのではなく、モデルを変更します。リンク関数で、次のようなスコープ変数に初期属性値を格納します。
scope.myvalue = attrs.attr1;
次に、次のように (上記のスコープへの参照を使用して) アプリの外部で値を変更できます。
scope.$apply(function(){
scope.myvalue = 1000;
console.log('attribute changed');
});
$observe
ビューが jQuery で直接操作される場合、機能する属性への、 、または分離スコープ バインディングの使用についてはわかりません。$watch
これらはすべて、属性式自体に一度だけバインドされるためです。ファーストラン。値を変更すると、これらのバインディングが失敗します。したがって$watch
、DOM要素自体の属性が必要になります( ではなくattrs
):
scope.$watch(function(){
return $(el).attr('attr1'); // Set a watch on the actual DOM value
}, function(newVal){
scope.message = newVal;
});
次に、次のように (上記のスコープへの参照を使用して) アプリの外部で値を変更できます。
scope.$apply(function(){
$("#d1").attr("attr1",1000);
});