为什么AngularJS在什么都没改变的情况下会触发$watch ?

Why does $watch trigger with AngularJS when nothing has changed?

本文关键字:watch 情况下 在什么 AngularJS 改变 为什么      更新时间:2023-09-26

谁能解释为什么$watch()是触发我的范围,即使newValue == oldValue在这里?

scope.$watch('element', function(newValue, oldValue) {
    if (newValue == oldValue) {
        console.log(newValue == oldValue);
        return;
    }
}, true);

"true"是输出,newValue和oldValue都是具有相同值的对象:

{"formID":"536826128a1c00617d3e4c5f","elementType":"TextFieldElement","required":false,"note":"","label":"","fieldName":"","_id":"5368261b8a1c00617d3e4c60","__v":0,"$$hashKey":"01B"}
{"formID":"536826128a1c00617d3e4c5f","elementType":"TextFieldElement","required":false,"note":"","label":"","fieldName":"","_id":"5368261b8a1c00617d3e4c60","__v":0,"$$hashKey":"01B"}

我从文档中了解到,将第三个参数的"true"传递给$watch使用angular.equals()比较对象的相等性。我还测试了angular.equals(),它也返回true。那么为什么要触发$watch()呢?

我使用的是AngularJS v1.2.16。

根据angular文档,这可以在初始化时发生:

在监听器注册到作用域后,监听器fn被异步调用(通过$evalAsync)来初始化监听器。在极少数情况下,这是不希望看到的,因为侦听器是在watchExpression的结果没有改变时调用的。要在侦听器fn中检测此场景,可以比较newVal和oldVal。如果这两个值相同(===),则由于初始化而调用侦听器。