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 相关文章推荐
JS getStyle获取最终样式函数代码
Apr 01 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
Sep 02 Javascript
js的hasownproperty使用示例
Mar 02 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
jQuery Validate初步体验(一)
Dec 12 Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
Feb 11 Javascript
微信用户访问小程序的登录过程详解
Sep 20 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 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 缓存函数代码
2008/08/27 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
Python函数学习笔记
2008/10/07 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python KMeans聚类问题分析
2018/02/23 Python
python实现猜数字小游戏
2020/03/24 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
《放小鸟》教学反思
2014/04/20 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
食品安全主题班会
2015/08/13 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python