溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Angular中數(shù)據(jù)綁定機(jī)制的示例分析

發(fā)布時間:2021-08-19 11:41:12 來源:億速云 閱讀:145 作者:小新 欄目:web開發(fā)

小編給大家分享一下Angular中數(shù)據(jù)綁定機(jī)制的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1.Angular.js擴(kuò)展瀏覽器的事件循環(huán)

瀏覽器持續(xù)等待例如用戶交互這樣的事件。當(dāng)你在一個<input>標(biāo)簽里輸入字符之后,這個事件的回調(diào)函數(shù)在JS解釋器中執(zhí)行了其包含的DOM操作,執(zhí)行完畢后,瀏覽器響應(yīng)地對DOM做出了變化。Angular拓展了這個事件循環(huán),使它有時候成為angular context 的執(zhí)行環(huán)境。

2.$watch list

$watch 可以檢測model的變化。每當(dāng)綁定一個數(shù)據(jù)到view上的時候,$watch隊(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 生成了一個1個$watch,每個person生成了2個$watch,總共是(1+2*10),21個$watch。$watch的生成階段是模板加載完成,也就是linking階段。(angular分為compile和linking階段),Angular會尋找每個directive(上面的例子中ng-repeat和{{}}都屬于directive),然后生成每個$watch。

3.$digest 循環(huán)

當(dāng)瀏覽器接收到angular context相關(guān)的事件時,$digest循環(huán)就會被觸發(fā)。它由2個小循環(huán)組成,1個處理evalAsync 隊(duì)列,另一個處理$watch隊(duì)列。$digest進(jìn)行循環(huán)時,將遍歷$watch隊(duì)列,查看是否有數(shù)據(jù)更新過,這種遍歷就叫做dirty-checkin(臟檢查),如果臟檢查發(fā)現(xiàn)有$watch更新,將會觸發(fā)新的臟檢查,直到所有的$watch都沒有更新。這樣就能保證每個model都不會變化。

臟檢查超過10次后會拋出異常防止無限循環(huán)。$digest循環(huán)結(jié)束后DOM會相應(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ù)時,angular會將事件封裝到$apply中。比如,ng-model="name"的輸入框,輸入字符“w”,事件會調(diào)用,$apply("name='w';"),完成$scope中的數(shù)據(jù)更新。

調(diào)用第三方庫時的數(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 ><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都會自增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ī)制如下圖:

Angular中數(shù)據(jù)綁定機(jī)制的示例分析

以上是“Angular中數(shù)據(jù)綁定機(jī)制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI