【发布时间】:2014-06-22 10:21:42
【问题描述】:
任何人都可以解释为什么 $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 了解到,将第三个参数的“true”传递给 $watch 会比较使用 angular.equals() 的对象相等性。我还用 angular.equals() 进行了测试,它也返回 true。那么为什么会触发 $watch() 呢?
我正在使用 AngularJS v1.2.16。
【问题讨论】:
-
只有一次吗?这确实发生在 init 上,文档说通过比较 oldVal 和 newVal 来检查它。
-
是的,它似乎只发生在 init 上,这似乎是问题所在。我在文档中忽略了这一点。在侦听器中使用 === 检查可以解决问题。如果您想在此处发布答案,我很乐意将其标记为答案。
-
谢谢!很高兴我能帮上忙。
标签: javascript angularjs