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对单选框(radio)操作的小例子
Apr 25 Javascript
JS 毫秒转时间示例代码
Sep 22 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
ES6新特性之解构、参数、模块和记号用法示例
Apr 01 Javascript
详解如何在Angular中快速定位DOM元素
May 17 Javascript
详解vue渲染从后台获取的json数据
Jul 06 Javascript
js防刷新的倒计时代码 js倒计时代码
Sep 06 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
layui prompt 设置允许空白提交的方法
Sep 24 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
php判断表是否存在的方法
2015/06/18 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
JS按字节截取字符长度实例
2013/11/20 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python读写文件方法总结
2015/06/09 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
python实现停车管理系统
2018/11/30 Python
python matplotlib拟合直线的实现
2019/11/19 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
英国门把手公司:Door Handle Company
2019/05/12 全球购物
商务助理岗位职责
2013/11/13 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
学校献爱心活动总结
2014/07/08 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
起诉书范文
2015/05/20 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
PHP中->和=>的意思
2021/03/31 PHP