为什么即使旧值和新值相同,也会在浏览器重新加载或角度路由更改时调用监视回调。例如
$scope.test = "blah";
$scope.watch("test", function(new,old){
console.log(new === old);
}
每当您重新加载页面或路由更改并返回到该控制器时,您都会在控制台日志中看到 true。我必须在回调中添加一个守卫以避免不必要的回调。是不是我做错了什么?
为什么即使旧值和新值相同,也会在浏览器重新加载或角度路由更改时调用监视回调。例如
$scope.test = "blah";
$scope.watch("test", function(new,old){
console.log(new === old);
}
每当您重新加载页面或路由更改并返回到该控制器时,您都会在控制台日志中看到 true。我必须在回调中添加一个守卫以避免不必要的回调。是不是我做错了什么?
如果您阅读文档http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch,他们会谈论何时发生这种情况。这实际上取决于您的应用程序的其余部分是如何设置的,但只需通过 === 进行快速检查就会让您知道它是否已更改(他们建议)
感谢 Mathew Berg 的上述回答,我在文档中找到了答案
在观察者注册到作用域后,监听器 fn 被异步调用(通过 $evalAsync)来初始化观察者。在极少数情况下,这是不可取的,因为当 watchExpression 的结果没有改变时调用了侦听器。要在侦听器 fn 中检测这种情况,您可以比较 newVal 和 oldVal。如果这两个值相同(===),则由于初始化而调用了侦听器。