Angular之$watch方法监视作用域
来源:互联网 发布:电视机顶盒软件 编辑:程序博客网 时间:2024/05/29 17:29
在使用angular时,常常对作用域中的属性进行监视,当其发生改变时,作出相应处理,angular为我们提供了
- number
- string
- null
- undefined
- boolean
- object
- symbol (ES6加入)
以上其中数据类型中,又有基本类型和引用类型的区别(此处不做过多备注),对于基本类型,我们每一次赋值,这个基本类型变量就会被真正复制一次。而对于引用类型来说,在赋值时,仅仅将赋值的变量指向了这个引用类型(基本类型复制的是值,引用类型复制的是引用地址)
$watch在监听两种类型属性变化时是有区别的
监听基本类型
<!DOCTYPE html><html lang="en" ng-app="watchModule"><head> <meta charset="UTF-8" > <title>watchModule</title> <script src="../../angular.min.js"></script></head><body><input type="text" ng-model="name"><div>{{count}}</div><script> var watchModule=angular.module('watchModule',[]); watchModule.run(['$rootScope',function ($rootScope) { $rootScope.name='liang'; $rootScope.count=0; $rootScope.$watch('name',function () { $rootScope.count++; }) }]);</script></body></html>
input里的内容每改变一次,count就+1
我们再看看这种方法对引用类型是否可以
监视引用类型
<!DOCTYPE html><html lang="en" ng-app="watchModule"><head> <meta charset="UTF-8" > <title>watchModule</title> <script src="../../angular.min.js"></script></head><body><div ng-repeat="item in items"> <input type="text" ng-model="item.value"> <span>{{item.value}}</span></div><div>{{count}}</div><script> var watchModule=angular.module('watchModule',[]); watchModule.run(['$rootScope',function ($rootScope) { $rootScope.items=[ {'value':1}, {'value':2}, {'value':3}, {'value':4}, ] $rootScope.count=0; $rootScope.$watch('items',function () { $rootScope.count++; }) }]);</script></body></html>
可以在浏览器上看到当内容变化时,count不再变化,这是因为,items的数组引用没有发生变化,即使一些属性变了,$watch也不会执行回调方法
$watch接受三个参数,第一个参数是需要监视的属性,第二个参数是监视的属性发生变化时间,执行的回调函数,第三个参数代表监视方法,默认false(引用监视),只要监视对象引用没有发生变化,就不算变化。在这个例子中,由于item的数组引用没有变化,只是一些元素属性变了。而当我们把第三个参数换成true是,监视就变成了“全局监视”,只要监视的属性发生变化,就会执行回调方法。
全局监视有一大缺点就是运行时需要遍历整个监视对象,然后在$digest之前吧整个对象深复制一遍,运行之后用angular.equal()将前后对象进行对比,导致项目消耗大量资源
除了全局监视之外,我们还可以使用一个$watchCollection的方法针对数组进行监视,他不会对数组中的每一项属性进行监视,但是会对数组项目的增减做出反应。
<!DOCTYPE html><html lang="en" ng-app="watchModule"><head> <meta charset="UTF-8" > <title>watchModule</title> <script src="../../angular.min.js"></script></head><body><div ng-repeat="item in items"> <input type="text" ng-model="item.value"> <span>{{item.value}}</span></div><div>{{count}}</div><script> var watchModule=angular.module('watchModule',[]); watchModule.run(['$rootScope',function ($rootScope) { $rootScope.items=[ {'value':1}, {'value':2}, {'value':3}, {'value':4}, ] $rootScope.count=0; $rootScope.$watchCollection('items',function () { $rootScope.count++; }) }]);</script></body></html>
解除监视
由于$watch方法调用完毕后挥发会另一个方法,我们只需要调用返回返回的方法可以接触作用域监视
<!DOCTYPE html><html lang="en" ng-app="watchModule"><head> <meta charset="UTF-8" > <title>watchModule</title> <script src="../../angular.min.js"></script></head><body><input type="text" ng-model="name"><div>{{count}}</div><script> var watchModule=angular.module('watchModule',[]); watchModule.run(['$rootScope',function ($rootScope) { $rootScope.name='liang'; $rootScope.count=0; var unbindWatcher=$rootScope.$watch('name',function (newValue,oldValue) { if(newValue=='xiao'){ unbindWatcher(); } $rootScope.count++; }) }]);</script></body></html>
阅读全文
0 0
- Angular之$watch方法监视作用域
- angular $watch方法监视模型变化
- angular--$watch监视用法
- Angular之作用域
- angular JS之$watch、$digest和$apply方法
- Angular $Watch
- angular $watch
- angular $watch
- angular学习之路---scope作用域
- Angular学习(三)之作用域
- Grunt之添加文件监视:Grunt-watch (已备份)
- angularjs-watch 监视事件
- [angular]服务之2$scope之$watch、$watchGroup、$watchCollection
- Angular作用域
- angular的作用域
- 二,Angular作用域
- angular 监控数据模型变化的事件方法$watch
- (五下)作用域,及其特点,$watch方法,$digest方法,$apply方法
- centos6.6 新建用户、sudo权限
- JS自执行匿名函数
- ITASCA_3DEC_V4.0 好用版本.
- 1140: 小数点后第n位 多实例
- 20个流行无线工具
- Angular之$watch方法监视作用域
- 为什么html导出pdf的时候,chrome导出图片为一片空白,火狐能导出图片?
- iOS 添加第三方库后 报clang: error: linker command failed with exit code 1 (use -v to see invocation)
- adb shell 模拟长按屏幕
- java中finally一定会执行吗?
- mysql索引总结----索引使用测试
- web端同一账户同时登陆踢掉前一个登录的用户
- Github 创建新分支
- ActiveMQ—Queue与Topic区别