AngularJS中watch監(jiān)聽用法分析
本文實例講述了AngularJS中watch監(jiān)聽用法。分享給大家供大家參考,具體如下:
ANGULAR 監(jiān)聽使用:
當angular數(shù)據(jù)模型發(fā)生變化時,我們需要如果需要根據(jù)他的變化觸發(fā)其他的事件。
$watch是一個scope函數(shù),用于監(jiān)聽模型變化,當你的模型部分發(fā)生變化時它會通知你。
$watch(watchExpression, listener, objectEquality);
watchExpression | 需要監(jiān)控的表達式 |
listener | 處理函數(shù),函數(shù)參數(shù)如下 function(newValue,oldValue, scope) |
objectEquality | 是否深度監(jiān)聽,如果設置為true,它告訴Angular檢查所監(jiān)控的對象中每一個屬性的變化. 如果你希望監(jiān)控數(shù)組的個別元素或者對象的屬性而不是一個普通的值, 那么你應該使用它 |
<!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>
此代碼監(jiān)控$scope的name值的變化,如果發(fā)生變化則觸發(fā)監(jiān)聽。
監(jiān)控對象:
<!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>
這里我們點擊按鈕會發(fā)現(xiàn)監(jiān)控并不會觸發(fā),原因是我們監(jiān)控了user對象,這個user對象沒喲發(fā)生變化,只不過屬性值發(fā)生了變化。
如果我們希望監(jiān)控user對象屬性發(fā)生變化,有兩個做法。
1.使用深度監(jiān)控。
方法如下:
<!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>
設置為深度監(jiān)控,只要對象發(fā)生變化,那么監(jiān)聽就會觸發(fā)。
2.直接寫對象的屬性值路徑。
var watch=$scope.$watch('user.name', function(newValue, oldValue) { //具體代碼就不全部寫了。
消除監(jiān)聽
系統(tǒng)中太多的監(jiān)聽會影響系統(tǒng)的性能,我們可以在滿足某些條件后,去掉監(jiān)聽。
去掉監(jiān)聽方法如下:
var watch=$scope.$watch('user', function(newValue, oldValue) { if (newValue === oldValue) { return; } $scope.updated++; $scope.$broadcast('userUpdate', newValue.name); },true); //去掉監(jiān)聽。 watch();
在系統(tǒng)中使用事件廣播。
比如在監(jiān)聽時,我們對外廣播一個事件,
在控制其中寫監(jiān)聽的處理方法:
實例如下:
$scope.$broadcast('userUpdate', newValue.name);
監(jiān)聽代碼:
$scope.$on('userUpdate',function(d,data){ console.info(data); })
這種做法最好使用在指令中,指令中廣播事件,在控制器中實現(xiàn)監(jiān)聽。好處在于實現(xiàn)代碼的重用。
希望本文所述對大家AngularJS程序設計有所幫助。
相關文章
Angular懶加載模塊與Combined?Injector原理全面解析
這篇文章主要為大家介紹了Angular懶加載模塊與Combined?Injector原理全面解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10利用Angularjs中模塊ui-route管理狀態(tài)的方法
這篇文章主要給大家介紹了如何用Angularjs中的模板ui-route來管理狀態(tài)的方法,文中通過示例代碼介紹的很詳細,相信對大家的理解和學習具有一定的參考借鑒價值,有需要的朋友可以一起來學習學習。2016-12-12解決angular2在雙向數(shù)據(jù)綁定時[(ngModel)]無法使用的問題
今天小編就為大家分享一篇解決angular2在雙向數(shù)據(jù)綁定時[(ngModel)]無法使用的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09Angular2-primeNG文件上傳模塊FileUpload使用詳解
這篇文章主要為大家詳細介紹了Angular2-primeNG文件上傳模塊FileUpload使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Angularjs中ng-repeat-start與ng-repeat-end的用法實例介紹
這篇文章主要給大家介紹了Angularjs中ng-repeat-start與ng-repeat-end的用法,文章開始先進行了簡單的介紹,而后通過完整的實例代碼詳細給大家介紹這兩者的用法,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12詳解Angular4中路由Router類的跳轉navigate
這篇文章主要介紹了詳解Angular4中路由Router類的跳轉navigate,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Angularjs 實現(xiàn)動態(tài)添加控件功能
這篇文章主要介紹了Angularjs 實現(xiàn)動態(tài)添加控件功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05