假如你只想晓得结论:
$scope.$watch(function(){$rootScope.xxx;},function(newVal,oldVal){
//do something
})
立时就有人问为何不是:
$rootScope.$watch("xxx",function(newVal,oldVal){
//do something
})
从我近来的一个bug来说说为何要用第一种体式格局。
逻辑如图,一开始我使用了 $rootScope.$watch 的写法。由于 angularjs 在 $rootScope 上的 watch 一旦注册全局有用。而我的这个全局变量恰好是定单信息,也就是说差别的 controller 对他都是有修改的,每一次修改就会触发 $rootScope.$watch 进入别的 controller。能够类比看一下 $rootScope 上的 $broadcast 会全局动身的。
实在这并非唯一的体式格局,查一下angular 源码不难找到 watch 要领源码不分有以下代码:
return function deregisterWatch() {
if (arrayRemove(array, watcher) >= 0) {
incrementWatchersCount(scope, -1);
}
lastDirtyWatch = null;
};
这段代码通知我们,手动清算 watch 是可行的。比方:
var watcher = $rootScope.$watch("xxx",function(){});
//手动消灭 watcher
watcher();
照样很简单对吧,以上要领一样能够用于 scope 上的 watch。
研讨到这里的时刻,以为有点题目,那我在 $scope 会被清算么?因而呼,继承翻源码,我在 $destroy 要领内里找到以下代码:
// Disable listeners, watchers and apply/digest methods
this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;
this.$on = this.$watch = this.$watchGroup = function() {
return noop;
};
this.$$listeners = {};
以上代码剖析很有能够有错,仅做参考,若有毛病迎接斧正。