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

首頁 > 語言 > JavaScript > 正文

詳解AngularJS臟檢查機制及$timeout的妙用

2024-05-06 15:15:43
字體:
來源:轉載
供稿:網友

||瀏覽器事件循環和Angular的MVW

“臟檢查”是Angular中的核心機制之一,它是實現雙向綁定、MVVM模式的重要基礎。

Angular將雙向綁定轉換為一堆watch表達式,然后遞歸檢查這些watch表達式的結果是否變了,如果變了,則執行相應的watcher函數。等到Model的值不再變化,也就不會再有watcher函數被觸發,一個完整的digest循環就結束了。

因為我們不需要改變編程思維,就能用相同的語言、相同的事件模型,快速開發NodeJS程序,所以NodeJS迅速火起來,JavaScript full-stack也日漸流行。

我們經常聽說Angular是一個MV*的框架,這是因為Angular拓展了瀏覽器的事件模型,建立了一個自己的上下文環境。

||Angular中的$watch函數

watch表達式很靈活:可以是一個函數,可以是$scope上的一個屬性名,也可以是一個字符串形式的表達式。$scope上的屬性名或表達式,最終仍會被$parse服務解析為響應的獲取屬性值的函數。

所有的watcher函數都會被unshift函數插入scope.$$watchers數組的頭部,以便后邊的$digest使用。

最后,$watch函數會返回一個反注冊函數,一旦我們調用它,就可以移除剛才注冊的watcher。

需要注意的是,Angular默認是不會使用angular.equals()函數進行深度比較的,因為使用===比較會更快,所以,它對數組或者Object進行比較時檢查的是引用。這就導致內容完全相同的兩個表達式被判定為不同。如果需要進行深度比較,第三個可選參數objectEquality,需要顯式設置為true,如$watch('someExp', function(){...}, true)。

Angular還提供了$watchGroup、$watchCollection方法來監聽數組或者是一組屬性。

||Angular中的$digest函數

前面提到Angular拓展了瀏覽器的事件循環,這是怎么回事呢?

當接受View上的事件指令所轉發的事件時,就會切換到Angular的上下文環境,來相應這類事件,$digest循環就會觸發。

$digest循環實際上包括兩個while循環。它們分別是:處理$evalAsync的異步運算隊列,處理$watch的watchers隊列。

當$digest循環發生的時候,它會遍歷當前$scope及其所有子$scope上已注冊的所有watchers函數。

遍歷一遍所有watcher函數稱為一輪臟檢查。執行完一輪臟檢查,如果任何一個watcher所監聽的值改變過,那么就會重新再進行一輪臟檢查,直到所有的watcher函數都報告其所監聽的值不再變了。

當$digest循環結束時,才把模型的變化結果更新到DOM中去。這樣可以合并多個更新,防止頻繁的DOM屬性。

需要注意的是,在$digest循環結束之前,如果超過了10輪臟檢查,就會拋出一個異常,以防止臟檢查無限循環下去。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 长兴县| 马公市| 牙克石市| 昭通市| 霍州市| 柘城县| 长宁区| 丘北县| 本溪| 鹰潭市| 丰台区| 阳高县| 巴林左旗| 万年县| 略阳县| 东山县| 九寨沟县| 纳雍县| 潢川县| 合肥市| 平泉县| 闵行区| 惠水县| 金堂县| 巴南区| 喜德县| 东光县| 旬阳县| 息烽县| 玉溪市| 鸡泽县| 东阳市| 安岳县| 邻水| 扬中市| 曲阜市| 静宁县| 高密市| 卢龙县| 河源市| 元朗区|