AngularJS中watch监听用法分析
本文实例讲述了AngularJS中watch监听用法。分享给大家供大家参考,具体如下:
ANGULAR监听使用:
当angular数据模型发生变化时,我们需要如果需要根据他的变化触发其他的事件。
$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你。
$watch(watchExpression,listener,objectEquality);
function(newValue,oldValue,scope)
<!DOCTYPEhtml> <htmlng-app="app"> <head> <metacharset="UTF-8"> <title>Inserttitlehere</title> </head> <scriptsrc="assets/angular.min.js"></script> <scriptsrc="assets/js/jquery.min.js"></script> <scripttype="text/javascript"> varapp=angular.module("app",[]); app.controller('MainCtrl',function($scope){ $scope.name="Angular"; $scope.updated=-1; $scope.$watch('name',function(newValue,oldValue){ if(newValue===oldValue){return;}//AKAfirstrun $scope.updated++; }); vari=0; $scope.getScope=function(){ //console.info(this); varobj=$("#btnTest"); i++; angular.element(obj).scope().name="hello"+i; } }); </script> <bodyng-controller="MainCtrl"> <inputng-model="name"/> Nameupdated:{{updated}}times. <buttonid="btnTest"ng-click="getScope()">获取scope</button> </body> </html>
此代码监控$scope的name值的变化,如果发生变化则触发监听。
监控对象:
<!DOCTYPEhtml> <htmlng-app="app"> <head> <metacharset="UTF-8"> <title>Inserttitlehere</title> </head> <scriptsrc="assets/angular.min.js"></script> <scriptsrc="assets/js/jquery.min.js"></script> <scripttype="text/javascript"> varapp=angular.module("app",[]); app.controller('MainCtrl',function($scope){ $scope.user={name:"Fox"}; $scope.updated=-1; varwatch=$scope.$watch('user',function(newValue,oldValue){ if(newValue===oldValue){return;} $scope.updated++; $scope.$broadcast('userUpdate',newValue.name); }); //watch(); vari=0; $scope.$on('userUpdate',function(d,data){ console.info(data); }) $scope.getScope=function(){ //console.info(this); varobj=$("#btnTest"); i++; angular.element(obj).scope().user.name="hello"+i; } }); </script> <bodyng-controller="MainCtrl"> <inputng-model="user.name"/> Nameupdated:{{updated}}times. <buttonid="btnTest"ng-click="getScope()">获取scope</button> </body> </html>
这里我们点击按钮会发现监控并不会触发,原因是我们监控了user对象,这个user对象没哟发生变化,只不过属性值发生了变化。
如果我们希望监控user对象属性发生变化,有两个做法。
1.使用深度监控。
方法如下:
<!DOCTYPEhtml> <htmlng-app="app"> <head> <metacharset="UTF-8"> <title>Inserttitlehere</title> </head> <scriptsrc="assets/angular.min.js"></script> <scriptsrc="assets/js/jquery.min.js"></script> <scripttype="text/javascript"> varapp=angular.module("app",[]); app.controller('MainCtrl',function($scope){ $scope.user={name:"Fox"}; $scope.updated=-1; varwatch=$scope.$watch('user',function(newValue,oldValue){ if(newValue===oldValue){return;} $scope.updated++; $scope.$broadcast('userUpdate',newValue.name); },true); //watch(); vari=0; $scope.$on('userUpdate',function(d,data){ console.info(data); }) $scope.getScope=function(){ //console.info(this); varobj=$("#btnTest"); i++; angular.element(obj).scope().user.name="hello"+i; } }); </script> <bodyng-controller="MainCtrl"> <inputng-model="user.name"/> Nameupdated:{{updated}}times. <buttonid="btnTest"ng-click="getScope()">获取scope</button> </body> </html>
设置为深度监控,只要对象发生变化,那么监听就会触发。
2.直接写对象的属性值路径。
varwatch=$scope.$watch('user.name',function(newValue,oldValue){ //具体代码就不全部写了。
消除监听
系统中太多的监听会影响系统的性能,我们可以在满足某些条件后,去掉监听。
去掉监听方法如下:
varwatch=$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程序设计有所帮助。