最好在指令内进行此更改。如果由于某种原因无法做到这一点,那么有几种选择。
在应用外部,获取对应用内任何 DOM 元素的引用。使用该引用,您可以获取对其范围的引用。您可以使用 ID 为 d1 的元素。例如:
var domElement = document.getElementById('d1');
var scope = angular.element(domElement).scope();
这里有几个选项:
选项 1
修改模型而不是直接更改视图。在链接函数中,将初始属性值存储在范围变量中,例如:
scope.myvalue = attrs.attr1;
然后您可以更改应用程序外部的值(使用上面对范围的引用),例如:
scope.$apply(function(){
scope.myvalue = 1000;
console.log('attribute changed');
});
Here is a fiddle
选项 2
如果直接使用 jQuery 操作视图,我不知道有任何使用 $observe、$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);
});
Here is a fiddle