欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angular數(shù)據(jù)綁定機(jī)制原理

 更新時(shí)間:2018年04月17日 14:03:17   作者:fangunhs  
本篇文章主要介紹了Angular數(shù)據(jù)綁定機(jī)制原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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è)長(zhǎng)度為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ù)更新過(guò),這種遍歷就叫做dirty-checkin(臟檢查),如果臟檢查發(fā)現(xiàn)有$watch更新,將會(huì)觸發(fā)新的臟檢查,直到所有的$watch都沒(méi)有更新。這樣就能保證每個(gè)model都不會(huì)變化。

臟檢查超過(guò)10次后會(huì)拋出異常防止無(wú)限循環(huán)。$digest循環(huán)結(jié)束后DOM會(huì)相應(yīng)地發(fā)生變化。其實(shí)$digest從字面意義理解就像“消化”的過(guò)程一樣,逐漸地把所有營(yíng)養(yǎng)($watch的變化)都吸收掉。

4.通過(guò)$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)用第三方庫(kù)時(shí)的數(shù)據(jù)綁定

當(dāng)在angular中調(diào)用jquery,并不能更新jquery綁定的數(shù)據(jù),因?yàn)閖query沒(méi)有調(diào)用$apply,事件沒(méi)有進(jìn)入angular context,導(dǎo)致$digest沒(méi)有執(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í)際沒(méi)有。其實(shí)$scope(ViewModel)已經(jīng)改變,但是沒(méi)有強(qiáng)制執(zhí)行$digest。修改click事件如下:

element.bind('click', function() {
 scope.$apply(function() {
   scope.foo++;
   scope.bar++;
 });
})

經(jīng)過(guò)調(diào)用$apply實(shí)現(xiàn)了預(yù)期。

5.總結(jié)

angular事件綁定機(jī)制如下圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • AngularJS入門(mén)教程之過(guò)濾器用法示例

    AngularJS入門(mén)教程之過(guò)濾器用法示例

    這篇文章主要介紹了AngularJS過(guò)濾器用法,結(jié)合實(shí)例形式簡(jiǎn)單的分析了AngularJS過(guò)濾器的功能及基本用法,并舉例說(shuō)明了自定義過(guò)濾器的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-11-11
  • 詳解Angualr 組件間通信

    詳解Angualr 組件間通信

    本篇文章主要介紹了Angualr 組件間通信,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Angular CLI在Angular項(xiàng)目中如何使用scss詳解

    Angular CLI在Angular項(xiàng)目中如何使用scss詳解

    angular-cli自身支持Scss預(yù)處理器,Scss比css更加方便靈活,而且層次清晰,代碼整潔。下面這篇文章主要給大家介紹了關(guān)于Angular CLI在Angular項(xiàng)目中如何使用scss的相關(guān)資料,需要的朋友可以參考下。
    2018-04-04
  • 詳解angularJs中關(guān)于ng-class的三種使用方式說(shuō)明

    詳解angularJs中關(guān)于ng-class的三種使用方式說(shuō)明

    本篇文章主要介紹了angularJs中關(guān)于ng-class的三種使用方式說(shuō)明,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • AngularJS使用ocLazyLoad實(shí)現(xiàn)js延遲加載

    AngularJS使用ocLazyLoad實(shí)現(xiàn)js延遲加載

    這篇文章主要介紹了AngularJS使用ocLazyLoad實(shí)現(xiàn)js延遲加載的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • angular的輸入和輸出的使用方法

    angular的輸入和輸出的使用方法

    這篇文章主要介紹了angular的輸入和輸出的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • AngularJS實(shí)現(xiàn)tab選項(xiàng)卡的方法詳解

    AngularJS實(shí)現(xiàn)tab選項(xiàng)卡的方法詳解

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)tab選項(xiàng)卡的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了AngularJS實(shí)現(xiàn)tab選項(xiàng)卡的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-07-07
  • 總結(jié)十個(gè)Angular.js由淺入深的面試問(wèn)題

    總結(jié)十個(gè)Angular.js由淺入深的面試問(wèn)題

    這篇文章雖然只有10個(gè)問(wèn)題,但是覆蓋了angular開(kāi)發(fā)中的各個(gè)方面,有基本的知識(shí)點(diǎn),也有在開(kāi)發(fā)過(guò)程中遇見(jiàn)的問(wèn)題,同時(shí)也有較為開(kāi)放性的問(wèn)題去辨別面試者的基礎(chǔ)水準(zhǔn)和項(xiàng)目經(jīng)驗(yàn),注意答案僅供參考哦~
    2016-08-08
  • 微信+angularJS的SPA應(yīng)用中用router進(jìn)行頁(yè)面跳轉(zhuǎn),jssdk校驗(yàn)失敗問(wèn)題解決

    微信+angularJS的SPA應(yīng)用中用router進(jìn)行頁(yè)面跳轉(zhuǎn),jssdk校驗(yàn)失敗問(wèn)題解決

    本文主要介紹微信+angularJS的SPA應(yīng)用中用router進(jìn)行頁(yè)面跳轉(zhuǎn),jssdk校驗(yàn)失敗問(wèn)題解決,這里提供了詳細(xì)的操作方式,有需要的小伙伴可以參考下
    2016-09-09
  • AngularJS學(xué)習(xí)筆記之依賴(lài)注入詳解

    AngularJS學(xué)習(xí)筆記之依賴(lài)注入詳解

    下面小編就為大家?guī)?lái)一篇AngularJS學(xué)習(xí)筆記之依賴(lài)注入詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05

最新評(píng)論