AngularJS:为什么在`$ watch`监听器中检查newValue是否与oldValue相同?

时间:2015-02-01 13:23:31

标签: javascript angularjs javascript-events

我多次看到这种模式:

$scope.$watch('full_name', function(newVal, oldVal, scope) {

 if(newVal === oldVal) {
   return
 } else {
 }
}

我不太了解if(newVal==oldVal)分支,因为它看起来没用..只有在监视值被更改时才调用侦听器回调函数?如果是这种情况,newVal是否应始终与oldVal不同? 如果没有,是否有人有关于newVal==oldVal分支可以做什么的例子?

谢谢!

1 个答案:

答案 0 :(得分:3)

if (newVal === oldVal)构造是跳过初始化。 AngularJS documentation指出,当您附加手表时,它会使用undefined, undefined调用一次回调。为防止您的监视功能将此调用误认为是模型更改,您可以添加if构造。

  

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