【问题标题】:Why does $watch trigger with AngularJS when nothing has changed?为什么在没有任何变化的情况下使用 AngularJS 触发 $watch?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多