国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Angular數據綁定機制原理

2019-11-19 14:01:07
字體:
來源:轉載
供稿:網友

1.Angular.js擴展瀏覽器的事件循環

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

2.$watch list

$watch 可以檢測model的變化。每當綁定一個數據到view上的時候,$watch隊列就會插入一條對應的$watch。例子如下:

controller.js:

app.controller('MainCtrl', function($scope) { $scope.people = [...]; // 假設長度為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 循環

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

臟檢查超過10次后會拋出異常防止無限循環。$digest循環結束后DOM會相應地發生變化。其實$digest從字面意義理解就像“消化”的過程一樣,逐漸地把所有營養($watch的變化)都吸收掉。

4.通過$apply 進入 angular context

$apply 決定事件是否進入angular context,使用angualr的自帶directive,比如ng-model,更改綁定的數據時,angular會將事件封裝到$apply中。比如,ng-model="name"的輸入框,輸入字符“w”,事件會調用,$apply("name='w';"),完成$scope中的數據更新。

調用第三方庫時的數據綁定

當在angular中調用jquery,并不能更新jquery綁定的數據,因為jquery沒有調用$apply,事件沒有進入angular context,導致$digest沒有執行。例子如下:

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;});

例子中,每次點擊該元素,預期count1和count2都會自增1,但實際沒有。其實$scope(ViewModel)已經改變,但是沒有強制執行$digest。修改click事件如下:

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

經過調用$apply實現了預期。

5.總結

angular事件綁定機制如下圖:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芦溪县| 阿巴嘎旗| 唐河县| 台州市| 宽甸| 军事| 东辽县| 锦屏县| 新沂市| 平度市| 大关县| 伊宁县| 白沙| 黔南| 灵宝市| 青冈县| 鹿邑县| 清徐县| 阿图什市| 昌平区| 离岛区| 宣威市| 阿图什市| 南木林县| 崇仁县| 大足县| 板桥市| 三门峡市| 略阳县| 昔阳县| 贡嘎县| 平昌县| 丰顺县| 密山市| 宜兰市| 射阳县| 鹤峰县| 湛江市| 枞阳县| 杭锦旗| 敦化市|