2014-05-06 36 views
1

任何人都可以解释为什么$ watch()为我的范围解雇,即使newValue == oldValue在这里?

scope.$watch('element', function(newValue, oldValue) { 
    if (newValue == oldValue) { 
     console.log(newValue == oldValue); 
     return; 
    } 
}, 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()的对象相等。我还用angular.equals()进行了测试,并且它也返回true。那么为什么$ watch()被触发呢?

我正在使用AngularJS v1.2.16。

+1

是否只有一次?这确实发生在init上,文档说通过比较oldVal和newVal来检查它。 – aet

+0

是的,它似乎只发生在初始化,这似乎是问题。我在文档中忽略了这一点。在监听器中使用===检查解决了这个问题。如果您想在此发布答案,我很乐意将其标记为答案。 –

+0

谢谢!很高兴我能帮上忙。 – aet

回答

4

每角文档,这可能发生在初始化:

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

相关问题