手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >Angularjs全局变量被作用域监听的正确姿势
Angularjs全局变量被作用域监听的正确姿势
摘要:如果你只想知道结论:$scope.$watch($rootScope.xxx,function(newVal,oldVal){//dosom...

如果你只想知道结论:

$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全局变量被作用域监听的正确姿势】相关文章:

Angular发布1.5正式版,专注于向Angular 2的过渡

探索angularjs+requirejs全面实现按需加载的套路

AngularJS身份验证的方法

自己编写的支持Ajax验证的JS表单验证插件

jQuery插件制作之全局函数用法实例

JavaScript函数使用的基本教程

图片完美缩放

创建你的第一个AngularJS应用的方法

JSON简介以及用法汇总

AngularJS向后端ASP.NET API控制器上传文件

精品推荐
分类导航