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 相关文章推荐
CSS+JS构建的图片查看器
Jul 22 Javascript
js 模拟气泡屏保效果代码
Jul 10 Javascript
node.js中的fs.write方法使用说明
Dec 15 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
Dec 03 Javascript
jQuery事件绑定用法详解
Sep 08 Javascript
聊一聊JS中的prototype
Sep 29 Javascript
webpack配置sass模块的加载的方法
Jul 30 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
实例讲解JavaScript预编译流程
Jan 24 Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
May 11 Javascript
如何开发一个渐进式Web应用程序PWA
May 10 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php多文件上传实现代码
2014/02/20 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
Python数据类型详解(一)字符串
2016/05/08 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
WxPython建立批量录入框窗口
2019/02/27 Python
python创建学生成绩管理系统
2019/11/22 Python
python 实现list或string按指定分段
2019/12/25 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
喜之郎果冻广告词
2014/03/20 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
详解Python类和对象内容
2021/06/22 Python