Angularjs全局变量被作用域监听的正确姿势
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Angularjs全局变量被作用域监听的正确姿势,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1414字,纯文字阅读大概需要3分钟。
内容图文
![Angularjs全局变量被作用域监听的正确姿势](/upload/InfoBanner/zyjiaocheng/354/655814a00b3a4f098e98d67ff38f1652.jpg)
如果你只想知道结论:
$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全局变量被作用域监听的正确姿势,希望大家有所帮助,本文写的不好还请各位大侠多多指教。
内容总结
以上是互联网集市为您收集整理的Angularjs全局变量被作用域监听的正确姿势全部内容,希望文章能够帮你解决Angularjs全局变量被作用域监听的正确姿势所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。