Angularjs全局变量被作用域监听的正确姿势


Posted in Javascript onFebruary 06, 2016

如果你只想知道结论:

$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 相关文章推荐
jQuery 操作下拉列表框实现代码
Feb 22 Javascript
jquery获取div宽度的实现思路与代码
Jan 13 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
Bootstrap中CSS的使用方法
Feb 17 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
Mar 11 Javascript
常用的js验证和数据处理总结
Aug 02 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
Node.js中常规的文件操作总结
Oct 13 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 Javascript
vue实现抽屉弹窗效果
Nov 15 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 #Javascript
简介AngularJS中$http服务的用法
Feb 06 #Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
Feb 06 #Javascript
JavaScript中数组添加值和访问值常见问题
Feb 06 #Javascript
详解Angularjs filter过滤器
Feb 06 #Javascript
Angularjs中如何使用filterFilter函数过滤
Feb 06 #Javascript
浅析Javascript匿名函数与自执行函数
Feb 06 #Javascript
You might like
php获取文件名后缀常用方法小结
2015/02/24 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
微信小程序开发探究
2016/12/27 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python去除扩展名的实例讲解
2018/04/23 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
农民致富事迹材料
2014/01/23 职场文书
搞笑老公保证书
2015/02/26 职场文书
新员工试用期自我评价
2015/03/10 职场文书