为什么$ watch会在没有任何变化时使用AngularJS触发?

时间:2014-05-06 00:11:57

标签: javascript angularjs

有人可以解释为什么$ 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"}

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

我正在使用AngularJS v1.2.16。

1 个答案:

答案 0 :(得分:5)

根据角度文档,这可能发生在初始化:

  

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