为什么在浏览器重新加载或角度路由更改时调用手表回调,即使旧值和新值相同。例如AngularJS - watcher在重载/路由器更改期间触发回调?
$scope.test = "blah";
$scope.watch("test", function(new,old){
console.log(new === old);
}
您将看到控制台登录真正重新载入网页的任何时间或路线改变路程,回到那个控制器。为了避免不必要的回调,我必须在回调中添加一个警卫。有什么我做错了吗?
为什么在浏览器重新加载或角度路由更改时调用手表回调,即使旧值和新值相同。例如AngularJS - watcher在重载/路由器更改期间触发回调?
$scope.test = "blah";
$scope.watch("test", function(new,old){
console.log(new === old);
}
您将看到控制台登录真正重新载入网页的任何时间或路线改变路程,回到那个控制器。为了避免不必要的回调,我必须在回调中添加一个警卫。有什么我做错了吗?
感谢上述来自Mathew Berg ,我发现在documentation
答案后观察者与范围登记,听者FN是 异步调用(通过$ evalAsync)来初始化观察者。在极少的情况下,这是不受欢迎的,因为当watchExpression的结果没有改变时调用监听器。要在侦听器fn中检测此场景 ,可以比较newVal和oldVal。如果 这两个值是相同的(===),那么听者被称为 初始化。
如果您阅读文档http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch,他们会讨论发生这种情况的时间。这真的取决于你的应用程序的其余部分是如何设置的,但只是通过===快速检查会让你知道它是否被改变(他们建议)