1

为什么即使旧值和新值相同,也会在浏览器重新加载或角度路由更改时调用监视回调。例如

$scope.test = "blah"; 
$scope.watch("test", function(new,old){
  console.log(new === old);
} 

每当您重新加载页面或路由更改并返回到该控制器时,您都会在控制台日志中看到 true。我必须在回调中添加一个守卫以避免不必要的回调。是不是我做错了什么?

4

2 回答 2

1

如果您阅读文档http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$watch,他们会谈论何时发生这种情况。这实际上取决于您的应用程序的其余部分是如何设置的,但只需通过 === 进行快速检查就会让您知道它是否已更改(他们建议)

于 2013-05-22T15:27:41.433 回答
0

感谢 Mathew Berg 的上述回答,我在文档中找到了答案

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

于 2013-05-22T18:56:30.113 回答