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 性能优化指南 (1)
May 21 Javascript
关于Javascript模块化和命名空间管理的问题说明
Dec 06 Javascript
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
JS打印gridview实现原理及代码
Feb 05 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
Aug 17 jQuery
vue计算属性和监听器实例解析
May 10 Javascript
微信小程序如何获取用户收货地址
Nov 27 Javascript
vue和iview实现Scroll 数据无限滚动功能
Oct 31 Javascript
JS实现随机抽取三人
Nov 06 Javascript
JavaScript cookie原理及使用实例
May 08 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
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
用PHP代码给图片加水印
2015/07/01 PHP
php实现短信发送代码
2015/07/05 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
python的中异常处理机制
2018/08/30 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Pandas的Apply函数具体使用
2020/07/21 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
2014年单位法制宣传日活动总结
2014/11/01 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
五一劳动节慰问信
2015/02/14 职场文书