AngularJS中的$watch(),$digest()和$apply()區(qū)分
AngularJS $scope里面的$watch(),$digest()和$apply()是AngularJS的核心函數(shù),學習AngularJS必須理解這幾個函數(shù)。
在綁定$scope中的變量到view的時候,AngularJS自動在內(nèi)部創(chuàng)建一個"Watch"。"Watch"用于監(jiān)聽AngularJS scope中變量的改變??梢酝ㄟ^調(diào)用$scope.$watch()這個方法來創(chuàng)建"Watch"。
$scope.$digest()函數(shù)會循環(huán)訪問所有的watches,并檢測其所監(jiān)聽的$scope中的變量是否改變。如果變量發(fā)生改變,會調(diào)用該變量對應的監(jiān)聽函數(shù)。監(jiān)聽函數(shù)可以實現(xiàn)很多操作,比如讓html里面的text文本顯示最新的變量值。可見,$scope.$digest是可以觸發(fā)數(shù)據(jù)綁定更新的。
大部分情況下,AngualrJS會自動調(diào)用$scope.$watch()和$scope.$digest()函數(shù),但是在某些情況下,我們需要手動調(diào)用他們,因此,有必要了解他們是怎么工作的。
$scope.$apply()這個函數(shù)會先執(zhí)行一些代碼,之后在調(diào)用$scope.$digest()。所有的watches會被檢測一次,相應的監(jiān)聽函數(shù)也會被執(zhí)行。$scope.$apply()在AngularJS與其它javascript代碼集成時是很有用的。
接下來我們具體的講解下$watch(), $digest() 和 $apply()。
$watch()
$watch(watchExpression, listener, [objectEquality])
watchExpression:監(jiān)聽對象,可以是string或者function(scope){}
listener:監(jiān)聽對象發(fā)生改變時執(zhí)行的回調(diào)函數(shù)function(newVal,oldVal,scope){}
objectEquality:是否深度監(jiān)聽,如果設置為true,它告訴Angular檢查所監(jiān)控的對象中每一個屬性的變化。如果你希望監(jiān)控數(shù)組的個別元素或者對象的屬性而不是一個普通的值, 那么你應該使用它。(默認值:false)
$digest()
檢測當前scope以及子scope中所有的watches,因為監(jiān)聽函數(shù)會在執(zhí)行過程中修改model(scope中的變量),$digest()會一直被調(diào)用直到model沒有再變。當調(diào)用超過10次時,$digest()會拋出一個異常"Maximum iteration limit exceeded',以此來防止程序進入一個死循環(huán)。
$apply()
$apply([exp])
exp:string或者function(scope){}
$apply()生命周期偽代碼示意圖如下
function $apply(expr) { try { return $eval(expr); } catch (e) { $exceptionHandler(e); } finally { $root.$digest(); } }
Example
下面我們通過一個例子來說明$watch,$digest和$apply。
<script> var module = angular.module("myapp", []); var myController1 = module.controller("myController", function($scope) { $scope.data = { time : new Date() }; $scope.updateTime = function() { $scope.data.time = new Date(); } document.getElementById("updateTimeButton") .addEventListener('click', function() { console.log("update time clicked"); $scope.data.time = new Date(); }); }); </script> <body ng-app="myapp"> <div ng-controller="myController"> {{data.time}} <br/> <button ng-click="updateTime()">update time - ng-click</button> <button id="updateTimeButton" >update time</button> </div> </body>
這段代碼會綁定$scope.data.time到HTML中顯示出來,同時這個綁定會自動創(chuàng)建一個watch來監(jiān)聽$scope.date.time的變化。此外,這里還有2個按鈕,第一個按鈕是通過ng-click Directive來調(diào)用$scope.updateTime方法,之后AngularJS會自動執(zhí)行$scope.$digest()使最新的時間顯示到HTML中。第二個按鈕是通過javascript代碼添加一個點擊事件,以此來更新HTML中的時間。但是第二個按鈕是不能工作的,它的解決辦法是在點擊事件的最后手動的去調(diào)用$scope.$digest()方法,如下:
document.getElementById("updateTimeButton") .addEventListener('click', function() { console.log("update time clicked"); $scope.data.time = new Date(); $scope.$digest(); });
另外一個解決辦法是調(diào)用$scope.$apply(),如下:
document.getElementById("updateTimeButton") .addEventListener('click', function() { $scope.$apply(function(){ console.log("update time clicked"); $scope.data.time = new Date(); } ); });
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助。
- angularJS中$apply()方法詳解
- 淺談angular.js中實現(xiàn)雙向綁定的方法$watch $digest $apply
- 全面解析Angular中$Apply()及$Digest()的區(qū)別
- AngularJS中$apply方法和$watch方法用法總結(jié)
- AngularJS報錯$apply already in progress的解決方法分析
- Angular項目中$scope.$apply()方法的使用詳解
- angularjs 中$apply,$digest,$watch詳解
- Angular.js中$apply()和$digest()的深入理解
- AngularJS雙向數(shù)據(jù)綁定原理之$watch、$apply和$digest的應用
- Angularjs中的$apply及優(yōu)化使用詳解
相關(guān)文章
AngularJS實現(xiàn)自定義指令與控制器數(shù)據(jù)交互的方法示例
這篇文章主要介紹了AngularJS實現(xiàn)自定義指令與控制器數(shù)據(jù)交互的方法,結(jié)合具體實例形式分析了AngularJS自定義指令的實現(xiàn)以及與控制器數(shù)據(jù)交互的操作技巧,需要的朋友可以參考下2017-06-06AngularJS中directive指令使用之事件綁定與指令交互用法示例
這篇文章主要介紹了AngularJS中directive指令使用之事件綁定與指令交互用法,結(jié)合實例形式分析了directive指令在模板的使用,事件的綁定及元素、屬性、控制器之間的交互相關(guān)操作技巧,需要的朋友可以參考下2016-11-11關(guān)于angularJs指令的Scope(作用域)介紹
下面小編就為大家?guī)硪黄猘ngularJs指令的Scope(作用域)介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10解決angularjs service中依賴注入$scope報錯的問題
今天小編就為大家分享一篇解決angularjs service中依賴注入$scope報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10簡介可以自動完成UI的AngularJS工具angular-smarty
這篇文章主要介紹了簡介可以自動完成UI的AngularJS工具angular-smarty,包括其中隔離作用域綁定指令符和promise的使用,需要的朋友可以參考下2015-06-06如何解決手機瀏覽器頁面點擊不跳轉(zhuǎn)瀏覽器雙擊放大網(wǎng)頁
這篇文章主要介紹了如何解決手機瀏覽器頁面點擊不跳轉(zhuǎn)瀏覽器雙擊放大網(wǎng)頁的相關(guān)資料,需要的朋友可以參考下2016-07-07