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链式操作如何实现以及为什么要用链式操作
Jan 17 Javascript
jQuery替换textarea中换行的方法
Jun 10 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
详解如何在react中搭建d3力导向图
Jan 12 Javascript
vue路由拦截及页面跳转的设置方法
May 24 Javascript
layui获取多选框中的值方法
Aug 15 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
javascript实现简易的计算器
Jan 17 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 Javascript
原生js实现自定义难度的扫雷游戏
Jan 22 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/06/16 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
Jquery attr("checked") 返回checked或undefined 获取选中失效
2013/10/10 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
详解numpy的argmax的具体使用
2019/05/27 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
python实现发送邮件
2021/03/02 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
物业管理求职自荐信
2013/09/25 职场文书
运动会解说词100字
2014/01/31 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
体育专业自荐书
2014/05/29 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
小学运动会入场口号
2015/12/24 职场文书
Pandas-DataFrame知识点汇总
2022/03/16 Python
volatile保证可见性及重排序方法
2022/08/05 Java/Android