Angularjs全局变量被作用域监听的正确姿势
作者:bea
如果你只想知道结论: $scope.$watch($rootScope.xxx,function(newVal,oldVal){//do something}) 马上就有人问为什么不是: $rootScope.$watch("xxx",function(newVal,oldVal){//do something}) 从我最近的一个bug来说说为什么要用第一种方式。 逻辑如图,一开始我使用了 $rootScope.$watch 的写法。因为 angularjs 在
如果你只想知道结论:
$scope.$watch($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 = {};
以上代码是本文给大家介绍的Angularjs全局变量被作用域监听的正确姿势,希望大家有所帮助,本文写的不好还请各位大侠多多指教。
猜你喜欢
您可能感兴趣的文章:
- Javascript 字符串模板的简单实现
- javascript基础知识分享之类与函数化
- JavaScript正则表达式的分组匹配详解
- js HTML5 Ajax实现文件上传进度条功能
- js随机生成26个大小写字母
- jquery实现具有嵌套功能的选项卡
- 基于jquery实现动态竖向柱状条特效
- 原生javascript实现自动更新的时间日期
- 原生javascript实现图片无缝滚动效果
- JavaScript实现点击单元格改变背景色的方法
- JavaScript实现弹出模态窗体并接受传值的方法
- JavaScript判断表单为空及获取焦点的方法
- 利用JS生成博文目录及CSS定制博客
- 浅析javascript函数表达式
- 详解AngularJS中的http拦截
- 详解Javacript和AngularJS中的Promises
- 深入浅析JavaScript面向对象和原型函数
- 基于JavaScript实现图片点击弹出窗口而不是保存
- javascript+css3 实现动态按钮菜单特效