有人可以解释为什么$ 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。
答案 0 :(得分:5)
根据角度文档,这可能发生在初始化:
在观察者注册观察者之后,异步调用侦听器fn(通过$ evalAsync)来初始化观察者。在极少数情况下,这是不合需要的,因为当watchExpression的结果没有改变时会调用监听器。要在侦听器fn中检测此场景,您可以比较newVal和oldVal。如果这两个值相同(===)则由于初始化而调用了监听器。