angularjs 某个作用域监听全局变量的准确姿态

假如你只想晓得结论:

$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 = {};

以上代码剖析很有能够有错,仅做参考,若有毛病迎接斧正。

    原文作者:flashback
    原文地址: https://segmentfault.com/a/1190000004417095
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞