AngularJS中watch监听用法分析
2016-11-04 10:27
736 查看
ANGULAR 监听使用:
当angular数据模型发生变化时,我们需要如果需要根据他的变化触发其他的事件。
$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你。
$watch(watchExpression, listener, objectEquality);
watchExpression | 需要监控的表达式 |
listener | 处理函数,函数参数如下 function(newValue,oldValue, scope) |
objectEquality | 是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化. 如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值, 那么你应该使用它 |
<!DOCTYPE html> <html ng-app="app"> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <script src="assets/angular.min.js"></script> <script src="assets/js/jquery.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); app.controller('MainCtrl', function($scope) { $scope.name = "Angular"; $scope.updated = -1; $scope.$watch('name', function(newValue, oldValue) { if (newValue === oldValue) { return; } // AKA first run $scope.updated++; }); var i=0; $scope.getScope=function(){ // console.info(this); var obj=$("#btnTest"); i++; angular.element( obj).scope().name="hello" +i; } }); </script> <body ng-controller="MainCtrl"> <input ng-model="name" /> Name updated: {{updated}} times. <button id="btnTest" ng-click="getScope()">获取scope</button> </body> </html>
此代码监控$scope的name值的变化,如果发生变化则触发监听。
监控对象:
<!DOCTYPE html> <html ng-app="app"> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <script src="assets/angular.min.js"></script> <script src="assets/js/jquery.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); app.controller('MainCtrl', function($scope) { $scope.user = { name: "Fox" }; $scope.updated = -1; var watch=$scope.$watch('user', function(newValue, oldValue) { if (newValue === oldValue) { return; } $scope.updated++;$scope.$broadcast('userUpdate', newValue.name);}); //watch(); var i=0;$scope.$on('userUpdate',function(d,data){ console.info(data); })$scope.getScope=function(){ // console.info(this); var obj=$("#btnTest"); i++; angular.element( obj).scope().user.name="hello" +i; } }); </script> <body ng-controller="MainCtrl"> <input ng-model="user.name" /> Name updated: {{updated}} times. <button id="btnTest" ng-click="getScope()">获取scope</button> </body> </html>
这里我们点击按钮会发现监控并不会触发,原因是我们监控了user对象,这个user对象没哟发生变化,只不过属性值发生了变化。
如果我们希望监控user对象属性发生变化,有两个做法。
1.使用深度监控。
方法如下:
<!DOCTYPE html> <html ng-app="app"> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <script src="assets/angular.min.js"></script> <script src="assets/js/jquery.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); app.controller('MainCtrl', function($scope) { $scope.user = { name: "Fox" }; $scope.updated = -1; var watch=$scope.$watch('user', function(newValue, oldValue) { if (newValue === oldValue) { return; } $scope.updated++;$scope.$broadcast('userUpdate', newValue.name);},true); //watch(); var i=0;$scope.$on('userUpdate',function(d,data){ console.info(data); })$scope.getScope=function(){ // console.info(this); var obj=$("#btnTest"); i++; angular.element( obj).scope().user.name="hello" +i; } }); </script> <body ng-controller="MainCtrl"> <input ng-model="user.name" /> Name updated: {{updated}} times. <button id="btnTest" ng-click="getScope()">获取scope</button> </body> </html>
设置为深度监控,只要对象发生变化,那么监听就会触发。
2.直接写对象的属性值路径。
var watch=$scope.$watch('user.name', function(newValue, oldValue) { //具体代码就不全部写了。
消除监听
系统中太多的监听会影响系统的性能,我们可以在满足某些条件后,去掉监听。
去掉监听方法如下:
var watch=$scope.$watch('user', function(newValue, oldValue) { if (newValue === oldValue) { return; } $scope.updated++;$scope.$broadcast('userUpdate', newValue.name);},true); //去掉监听。 watch();
在系统中使用事件广播。
比如在监听时,我们对外广播一个事件,
在控制其中写监听的处理方法:
实例如下:
$scope.$broadcast('userUpdate', newValue.name);
监听代码:
$scope.$on('userUpdate',function(d,data){ console.info(data); })
这种做法最好使用在指令中,指令中广播事件,在控制器中实现监听。好处在于实现代码的重用。
希望本文所述对大家AngularJS程序设计有所帮助。
您可能感兴趣的文章:
相关文章推荐
- angularjs的监听方法$watch、$watchGrou、$watchCollection的使用方法
- AngularJS中的DOM操作用法分析
- --@angularJS--$scope.watch监听模型变化
- 实例详解vue.js浅度监听和深度监听及watch用法
- AngularJs-watch监听input-value-并请求数据
- AngularJS过滤器filter用法实例分析
- AngularJS过滤器filter用法分析
- AngularJS过滤器filter用法分析
- angularJS中$watch监听不到输入控件(input、textarea)的空格输入问题
- Angularjs 利用 $on、$emit和$broadcast传值,利用$watch监听模型变化
- AngularJS中isolate scope的用法分析
- AngularJS中的promise用法分析
- AngularJs: $watch 监听作用域变化
- AngularJS中一般函数参数传递用法分析
- AngularJS中ng-class用法实例分析
- 深究AngularJS——监听模型$watch
- AngularJS变量及过滤器Filter用法分析
- AngularJS v1.6.3,监听数据变化$scope.$watch不生效问题
- Android编程之DatePicker和TimePicke简单时间监听用法分析
- C# 通过分析netstat -an所得信息 查看本机所监听的端口 及判断某端口是否可用