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 dom 操作详解 js加强
Jul 13 Javascript
目前流行的JavaScript库的介绍及对比
Sep 29 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
推荐10个2014年最佳的jQuery视频插件
Nov 12 Javascript
javascript弹出拖动窗口
Aug 11 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
Dec 22 Javascript
JS判断图片是否加载完成方法汇总(最新版)
May 13 Javascript
Vue方法与事件处理器详解
Dec 01 Javascript
Vue中render函数的使用方法
Jan 31 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 Javascript
jQuery实现影院选座订座效果
Apr 13 jQuery
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
一个简单的MySQL数据浏览器
2006/10/09 PHP
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php session和cookie使用说明
2010/04/07 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
javascript 写类方式之九
2009/07/05 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python如何访问字符串中的值
2020/02/09 Python
python 读取.nii格式图像实例
2020/07/01 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
XML文档面试题
2015/08/05 面试题
地震捐款倡议书
2014/08/29 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
委托书格式范文
2015/01/28 职场文书
秦兵马俑导游词
2015/02/02 职场文书
房屋所有权证明
2015/06/19 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
PHP正则表达式之RCEService回溯
2022/04/11 PHP