AngularJS髒檢查機制及$timeout的妙用
本篇文章主要介紹了詳解AngularJS骯髒檢查機制及$timeout的妙用,「髒檢查」是Angular中的核心機制之一,它是實現雙向綁定、MVVM模式的重要基礎,有興趣的可以了解一下
||瀏覽器事件循環和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輪髒檢查,就會拋出一個異常,以防止髒檢查無限循環下去。
什麼時候會進入這個Angular的上下文環境,觸發「髒檢查機制」呢?這個問題很重要,它同時也是比較頭痛的地方。
每一個進入Angular上下文環境的事件,都會執行一次$digest循環。對於ngModel監聽的表單互動控制項來說,每輸入一個字符,就會觸發一次循環來檢查$watcher函數,以便及時更新View。 Angular1.3之後可以利用ngModelOptions進行配置,來修改預設的觸發方式。
||Angular中的$apply
$digest是一個內部函數,正常的應用程式碼中是不應該直接調用它的。要主動觸發它,就要呼叫scope.$apply函數,它是觸發Angular「髒檢查機制」的常用公開介面。
要注意的是:Angular只能管理它所已知的行為觸發方式,而不能涵蓋所有的Angular操作場景。這就為什麼我們在封裝第三方jQuery插件時,不能自動更新視圖,而需要我們手動呼叫$scope.$apply。
整合jquery外掛的時候,有時會出現digest in progress錯誤。如果排除Bug之後仍然無法解決,那麼可以考慮用$timeout來解決。
$timeout的妙用
在延時任務中修改被綁定到介面中的變量,那麼window.setTimeout是不會觸發「髒檢查」來更新UI介面的。你可能會想:加上$scope.$apply不就解決了嘛。是的,這能解決UI介面更新的問題,但你可能會遇到另一個問題:
Error: $digest already in progress
function safeApply(scope, fn){ (scope. phase||scope.$root. phase) ? fn() : scope.$apply(fn); }
以上是AngularJS髒檢查機制及$timeout的妙用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

不少的用戶在升級完win11系統後會出現藍色畫面的現象,例如:clockwatchdogtimeout藍屏,那要怎麼解決?用戶可以看看更新驅動程式或是檢查過熱問題等等來進行操作,以下就讓本站來為用戶們來仔細的介紹一下clockwatchdogtimeout藍屏win11解決方法吧。 clockwatchdogtimeout藍色畫面win11解決方法1、更新驅動程式:更新CPU和主機板驅動程式可能解決問題。可以透過造訪製造商的網站下載最新的驅動程式。 2.檢查過熱問題:過熱也可能是導致此錯誤的原因之一

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

504 gateway timeout的解決方法:1、檢查伺服器負載;2、最佳化查詢和程式碼;3、增加逾時限制;4、檢查代理伺服器;5、檢查網路連線;6、使用負載平衡;7、監控和日誌; 8、故障排除;9、增加快取;10、分析請求。解決此錯誤通常需要綜合考慮多個因素,包括伺服器效能、網路連接、代理伺服器配置和應用程式最佳化等。

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest
