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

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

 更新時間:2017年06月19日 15:15:22   作者:abloume  
本篇文章主要介紹了詳解AngularJS臟檢查機制及$timeout的妙用,“臟檢查”是Angular中的核心機制之一,它是實現(xiàn)雙向綁定、MVVM模式的重要基礎(chǔ),有興趣的可以了解一下

||瀏覽器事件循環(huán)和Angular的MVW

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

Angular將雙向綁定轉(zhuǎn)換為一堆watch表達式,然后遞歸檢查這些watch表達式的結(jié)果是否變了,如果變了,則執(zhí)行相應(yīng)的watcher函數(shù)。等到Model的值不再變化,也就不會再有watcher函數(shù)被觸發(fā),一個完整的digest循環(huán)就結(jié)束了。

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

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

||Angular中的$watch函數(shù)

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

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

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

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

Angular還提供了$watchGroup、$watchCollection方法來監(jiān)聽數(shù)組或者是一組屬性。

||Angular中的$digest函數(shù)

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

當接受View上的事件指令所轉(zhuǎn)發(fā)的事件時,就會切換到Angular的上下文環(huán)境,來相應(yīng)這類事件,$digest循環(huán)就會觸發(fā)。

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

當$digest循環(huán)發(fā)生的時候,它會遍歷當前$scope及其所有子$scope上已注冊的所有watchers函數(shù)。

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

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

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

什么時候會進入這個Angular的上下文環(huán)境,觸發(fā)“臟檢查機制”呢?這個問題很重要,它同時也是比較讓人頭疼的地方。

每一個進入Angular上下文環(huán)境的事件,都會執(zhí)行一次$digest循環(huán)。對于ngModel監(jiān)聽的表單交互控件來說,每輸入一個字符,就會觸發(fā)一次循環(huán)來檢查$watcher函數(shù),以便及時更新View。在Angular1.3之后可以利用ngModelOptions進行配置,來修改默認的觸發(fā)方式。

||Angular中的$apply

$digest是一個內(nèi)部函數(shù),正常的應(yīng)用代碼中是不應(yīng)該直接調(diào)用它的。要想主動觸發(fā)它,就要調(diào)用scope.$apply函數(shù),它是觸發(fā)Angular“臟檢查機制”的常用公開接口。

需要注意的是:Angular只能管理它所已知的行為觸發(fā)方式,而不能涵蓋所有的Angular操作場景。這就為什么我們在封裝第三方j(luò)Query插件時,不能自動更新視圖,而需要我們手動調(diào)用$scope.$apply。

集成jquery插件的時候,有時會出現(xiàn)digest in progress錯誤。如果排除Bug之后仍然不能解決,那么可以考慮用$timeout來解決。

$timeout的妙用

在延時任務(wù)中修改被綁定到界面中的變量,那么window.setTimeout是不會觸發(fā)“臟檢查”來更新UI界面的。你可能想:加上$scope.$apply不就解決了嘛。是的,這能解決UI界面更新的問題,但是你可能會遇到另一個問題:

 Error: $digest already in progress

這是怎么回事兒?哦,Angular內(nèi)部正在進行“臟檢查”。一位聰明的程序員巧妙地寫了下面一段代碼來解決這個問題:

function safeApply(scope, fn){ 
  (scope.
phase||scope.$root.
phase) ? fn() : scope.$apply(fn); 
} 

代碼中,在執(zhí)行apply函數(shù)之前會首先檢查Angular內(nèi)部是不是正在做“臟檢查”,如果是就直接執(zhí)行函數(shù),不用$apply;反之沒有啟動臟檢查,那么就$apply執(zhí)行該函數(shù)。呵呵,“完美”解決,不是嗎?

請注意,筆者在上面的完美兩個字上加了引號。Angular已經(jīng)為我們內(nèi)置了$timeout服務(wù),它是Angular包裝原生javascript window.setTimeout而實現(xiàn)的。

$timeout有很多妙用,但一定不要濫用,$timeout實現(xiàn)apply功能不應(yīng)該是我們的第一方案,第一方案仍然應(yīng)該是使用Angular內(nèi)置的指令。

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

相關(guān)文章

  • 淺談Angular7 項目開發(fā)總結(jié)

    淺談Angular7 項目開發(fā)總結(jié)

    這篇文章主要介紹了淺談Angular7 項目開發(fā)總結(jié),本文在此做一次遇到問題的總結(jié),以便知識的掌握,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Angularjs上傳文件組件flowjs功能

    Angularjs上傳文件組件flowjs功能

    現(xiàn)在的項目,無論代銷,幾乎不會缺省的一個功能就是上傳下載功能,今天談一談使用AngularJS+bootsrtap下的上傳下載功能,需要的朋友參考下吧
    2017-08-08
  • 詳解AngularJS中的表格使用

    詳解AngularJS中的表格使用

    這篇文章主要介紹了詳解AngularJS中的表格使用,作為熱門的JavaScript框架,AngularJS中提供的表格功能十分強大,需要的朋友可以參考下
    2015-06-06
  • AngularJS中過濾器的使用與自定義實例代碼

    AngularJS中過濾器的使用與自定義實例代碼

    這篇文章運用實例代碼給大家介紹了angularjs中過濾器的使用和自定義過濾器,對大家學(xué)習(xí)AngularJS具有一定的參考借鑒價值,感興趣的朋友們可以參考借鑒。
    2016-09-09
  • 使用Angular CLI生成 Angular 5項目教程詳解

    使用Angular CLI生成 Angular 5項目教程詳解

    這篇文章主要介紹了使用Angular CLI生成 Angular 5項目的教程詳解 ,需要的朋友可以參考下
    2018-03-03
  • AngularJS通過$http和服務(wù)器通信詳解

    AngularJS通過$http和服務(wù)器通信詳解

    相信大家都知道AngularJS是一個前端框架,實現(xiàn)了可交互式的頁面,但是對于一個web應(yīng)用,頁面上進行展示的數(shù)據(jù)從哪里來,肯定需要服務(wù)端進行支持,那么AngularJS是如何同服務(wù)端進行交互的呢?通過這篇文章大家一起來看看吧。
    2016-09-09
  • Web前端框架Angular4.0.0 正式版發(fā)布

    Web前端框架Angular4.0.0 正式版發(fā)布

    經(jīng)歷了 6 個 RC 版本之后,Angular 發(fā)布了 4.0.0 正式版。下面這篇文章主要給大家介紹了關(guān)于Web前端框架Angular4.0.0 正式版發(fā)布的相關(guān)資料,文中介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-03-03
  • 如何利用@angular/cli V6.0直接開發(fā)PWA應(yīng)用詳解

    如何利用@angular/cli V6.0直接開發(fā)PWA應(yīng)用詳解

    這篇文章主要給大家介紹了如何利用@angular/cli V6.0直接開發(fā)PWA應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用@angular/cli V6.0具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2018-05-05
  • AngularJS的$location使用方法詳解

    AngularJS的$location使用方法詳解

    這篇文章主要介紹了AngularJS的$location使用方法詳解的相關(guān)資料,希望通過本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • angular4中*ngFor不能對返回來的對象進行循環(huán)的解決方法

    angular4中*ngFor不能對返回來的對象進行循環(huán)的解決方法

    今天小編就為大家分享一篇angular4中*ngFor不能對返回來的對象進行循環(huán)的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論