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 查找select ,并触发事件的实现代码
Mar 30 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
ztree获取当前选中节点子节点id集合的方法
Feb 12 Javascript
JavaScript实现输入框(密码框)出现提示语
Jan 12 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
Jun 12 Javascript
微信小程序 教程之引用
Oct 18 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
几种tab切换详解
Feb 03 Javascript
Vue 监听元素前后变化值实例
Jul 29 Javascript
如何利用node转发请求详解
Sep 17 Javascript
为什么推荐使用JSX开发Vue3
Dec 28 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
在Python中移动目录结构的方法
2016/01/31 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
python中kmeans聚类实现代码
2018/02/23 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
宿舍保安职务说明书
2014/02/25 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
公司管理建议书
2015/09/14 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js