Angular數(shù)據(jù)綁定機(jī)制原理
1.Angular.js擴(kuò)展瀏覽器的事件循環(huán)
瀏覽器持續(xù)等待例如用戶交互這樣的事件。當(dāng)你在一個(gè)<input>標(biāo)簽里輸入字符之后,這個(gè)事件的回調(diào)函數(shù)在JS解釋器中執(zhí)行了其包含的DOM操作,執(zhí)行完畢后,瀏覽器響應(yīng)地對(duì)DOM做出了變化。Angular拓展了這個(gè)事件循環(huán),使它有時(shí)候成為angular context 的執(zhí)行環(huán)境。
2.$watch list
$watch 可以檢測(cè)model的變化。每當(dāng)綁定一個(gè)數(shù)據(jù)到view上的時(shí)候,$watch隊(duì)列就會(huì)插入一條對(duì)應(yīng)的$watch。例子如下:
controller.js:
app.controller('MainCtrl', function($scope) {
$scope.people = [...]; // 假設(shè)長度為10
});
index.html:
<ul>
<li ng-repeat="person in people">
{{person.name}} - {{person.age}}
</li>
</ul>
其中ng-repeat 生成了一個(gè)1個(gè)$watch,每個(gè)person生成了2個(gè)$watch,總共是(1+2*10),21個(gè)$watch。$watch的生成階段是模板加載完成,也就是linking階段。(angular分為compile和linking階段),Angular會(huì)尋找每個(gè)directive(上面的例子中ng-repeat和{{}}都屬于directive),然后生成每個(gè)$watch。
3.$digest 循環(huán)
當(dāng)瀏覽器接收到angular context相關(guān)的事件時(shí),$digest循環(huán)就會(huì)被觸發(fā)。它由2個(gè)小循環(huán)組成,1個(gè)處理evalAsync 隊(duì)列,另一個(gè)處理$watch隊(duì)列。$digest進(jìn)行循環(huán)時(shí),將遍歷$watch隊(duì)列,查看是否有數(shù)據(jù)更新過,這種遍歷就叫做dirty-checkin(臟檢查),如果臟檢查發(fā)現(xiàn)有$watch更新,將會(huì)觸發(fā)新的臟檢查,直到所有的$watch都沒有更新。這樣就能保證每個(gè)model都不會(huì)變化。
臟檢查超過10次后會(huì)拋出異常防止無限循環(huán)。$digest循環(huán)結(jié)束后DOM會(huì)相應(yīng)地發(fā)生變化。其實(shí)$digest從字面意義理解就像“消化”的過程一樣,逐漸地把所有營養(yǎng)($watch的變化)都吸收掉。
4.通過$apply 進(jìn)入 angular context
$apply 決定事件是否進(jìn)入angular context,使用angualr的自帶directive,比如ng-model,更改綁定的數(shù)據(jù)時(shí),angular會(huì)將事件封裝到$apply中。比如,ng-model="name"的輸入框,輸入字符“w”,事件會(huì)調(diào)用,$apply("name='w';"),完成$scope中的數(shù)據(jù)更新。
調(diào)用第三方庫時(shí)的數(shù)據(jù)綁定
當(dāng)在angular中調(diào)用jquery,并不能更新jquery綁定的數(shù)據(jù),因?yàn)閖query沒有調(diào)用$apply,事件沒有進(jìn)入angular context,導(dǎo)致$digest沒有執(zhí)行。例子如下:
app.js
app.directive('clickable', function() {
return {
restrict: "E",
scope: {
count1: '=',
count2: '='
},
template: '<ul style="background-color: lightblue"><li>{{count1}}</li><li>{{count2}}</li></ul>',
link: function(scope, element, attrs) {
element.bind('click', function() {
scope.count1++;
scope.count2++;
});
}
}
});
app.controller('MainCtrl', function($scope) {
$scope.count1= 0;
$scope.count2= 0;
});
例子中,每次點(diǎn)擊該元素,預(yù)期count1和count2都會(huì)自增1,但實(shí)際沒有。其實(shí)$scope(ViewModel)已經(jīng)改變,但是沒有強(qiáng)制執(zhí)行$digest。修改click事件如下:
element.bind('click', function() {
scope.$apply(function() {
scope.foo++;
scope.bar++;
});
})
經(jīng)過調(diào)用$apply實(shí)現(xiàn)了預(yù)期。
5.總結(jié)
angular事件綁定機(jī)制如下圖:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Angularjs之ngModel中的值驗(yàn)證綁定方法
- 解決angular2在雙向數(shù)據(jù)綁定時(shí)[(ngModel)]無法使用的問題
- Angular動(dòng)態(tài)綁定樣式及改變UI框架樣式的方法小結(jié)
- AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法
- 詳解Angularjs 自定義指令中的數(shù)據(jù)綁定
- 淺談Angularjs中不同類型的雙向數(shù)據(jù)綁定
- angularjs 的數(shù)據(jù)綁定實(shí)現(xiàn)原理
- AngularJS雙向數(shù)據(jù)綁定原理之$watch、$apply和$digest的應(yīng)用
- 解析Angular 2+ 樣式綁定方式
- 詳解Angular數(shù)據(jù)綁定及其實(shí)現(xiàn)方式
相關(guān)文章
使用AngularJS實(shí)現(xiàn)可伸縮的頁面切換的方法
這篇文章主要介紹了使用AngularJS實(shí)現(xiàn)可伸縮的頁面切換的方法,AngularJS是一款熱門的JavaScript庫,需要的朋友可以參考下2015-06-06
AngularJS $http post 傳遞參數(shù)數(shù)據(jù)的方法
今天小編就為大家分享一篇AngularJS $http post 傳遞參數(shù)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
使用Angular Cli如何創(chuàng)建Angular私有庫詳解
這篇文章主要給大家介紹了關(guān)于使用Angular Cli如何創(chuàng)建Angular私有庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
AngularJS基礎(chǔ) ng-click 指令示例代碼
本文介紹AngularJS ng-click 指令,這里整理了ng-click指令的基礎(chǔ)知識(shí)并且附有簡單示例代碼和實(shí)現(xiàn)效果圖,有需要的小伙伴參考下2016-08-08
Angular模版驅(qū)動(dòng)表單的使用總結(jié)
這篇文章主要介紹了Angular模版驅(qū)動(dòng)表單的使用總結(jié),本文實(shí)現(xiàn)了Angular支持表單的雙向數(shù)據(jù)綁定,校驗(yàn),狀態(tài)管理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-05-05
Angular中使用ui router實(shí)現(xiàn)系統(tǒng)權(quán)限控制及開發(fā)遇到問題
這篇文章主要介紹了Angular中使用ui router實(shí)現(xiàn)系統(tǒng)權(quán)限控制及開發(fā)遇到問題的相關(guān)資料,本文分步驟介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
angularjs實(shí)現(xiàn)猜數(shù)字大小功能
這篇文章主要為大家詳細(xì)介紹了angularjs實(shí)現(xiàn)猜數(shù)字大小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09

