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 相关文章推荐
javascript中apply和call方法的作用及区别说明
Feb 14 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
Sep 10 Javascript
javascript鼠标右键菜单自定义效果
Dec 08 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
node.js中EJS 模板快速入门教程
May 08 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
回顾Javascript React基础
Jun 15 Javascript
原生js实现商品筛选功能
Oct 28 Javascript
vue.js循环radio的实例
Nov 07 Javascript
微信小程序文章列表功能完整实例
Jun 03 Javascript
在Vue中使用Select选择器拼接label的操作
Oct 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
joomla内置的表单验证功能使用方法
2010/06/11 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php的常量和变量实例详解
2017/06/27 PHP
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
Python 去除字符串中指定字符串
2020/03/05 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
css3media响应式布局实例
2016/07/08 HTML / CSS
美国在线家具网站:GDFStudio
2021/03/13 全球购物
小学校园广播稿(3篇)
2014/09/19 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
出差报告范文
2014/11/06 职场文书
水知道答案观后感
2015/06/08 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
Python实现制作销售数据可视化看板详解
2021/11/27 Python