javascript - 有没有办法观察 AngularJS 世界之外触发的属性变化?

标签 javascript jquery html angularjs angularjs-scope

我正在尝试理解 Angular 世界和非 Angular 世界之间的交互。

给定一个这样声明的指令:

<dir1 id="d1" attr1="100"/>

如果 Angular 之外的代码以这种方式更改指令:

$("#d1").attr("attr1", 1000);

指令如何知道其属性之一已更改?

最佳答案

最好在指令内进行此更改。如果出于某种原因这是不可能的,那么有几个选择。

在应用程序外部,获取对应用程序内任何 DOM 元素的引用。使用该引用,您可以获得对其范围的引用。您可以使用 id 为 d1 的元素。例如:

var domElement = document.getElementById('d1');
var scope = angular.element(domElement).scope();

这里有几个选项:

选项 1

修改模型而不是直接更改 View 。在链接函数中,将初始属性值存储在范围变量中,例如:

scope.myvalue = attrs.attr1;

然后您可以更改应用程序外部的值(使用上面对范围的引用),例如:

scope.$apply(function(){
    scope.myvalue = 1000;
    console.log('attribute changed');
});

Here is a fiddle

选项 2

如果直接使用 jQuery 操作 View ,我不知道是否使用 $observe$watch 或绑定(bind)到该属性的隔离范围会起作用,因为它们都绑定(bind)到属性表达式本身,仅在链接函数首次运行时绑定(bind)一次。更改该值将导致这些绑定(bind)失败。因此,您必须$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

关于javascript - 有没有办法观察 AngularJS 世界之外触发的属性变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159652/

相关文章:

javascript - 在 SPRING MVC 中使用 JSON 发出 POST 请求的正确方法?

javascript - 如何在page2 input上显示page1中的输入值?

asp.net - JSON 可以调用 .aspx 文件中的方法,但不能调用 .asmx(ASP.NET Web 服务)文件中的方法

html - 如何在 Zurb Foundation 6 中将背景图像添加到 HTML 电子邮件中

php - 如何成功地将 $_POST <options> 从 <select> 到 PHP 中的另一个页面?

javascript - MongoDB: "Unsupported projection option: pop: { $gt: 0.0 }"(调试中)

javascript - 仅当 div 包含特定文本时才运行 jQuery split() 函数

javascript - 显示文本区域中重复的单词数

javascript - 使用 jQuery 检索输入值

html - 将 Font Awesome 符号切成两半?