AngularJS -在重新加载/更改路由器时触发回调

AngularJS - watcher triggers callback during reload/router change?

本文关键字:路由器 回调 新加载 加载 AngularJS      更新时间:2023-09-26

为什么在浏览器重新加载或angular路由改变时,即使oldvalue和newvalue是相同的,也会调用watch回调?例如

$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。如果这两个值相同(===),则调用侦听器due初始化。