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 相关文章推荐
5 cool javascript apps
Mar 24 Javascript
javascript检查日期格式的函数[比较全]
Oct 17 Javascript
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
jquery实现奇偶行赋值不同css值
Feb 17 Javascript
Jquery之Bind方法参数传递与接收的三种方法
Jun 24 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
浅谈JavaScript for循环 闭包
Jun 22 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
d3.js中冷门却实用的内置函数总结
Feb 04 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
Mar 21 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
vuex存取值和映射函数使用说明
Jul 24 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的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
php把数组值转换成键的方法
2015/07/13 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python字符串与url编码的转换实例
2018/05/10 Python
python爬虫实例详解
2018/06/19 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
小学生演讲稿
2014/01/12 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
课题研究阶段性总结
2015/08/13 职场文书