淺談angular.js中實作雙向綁定的方法$watch $digest $apply_AngularJS
Angular.js 中的特性,雙向綁定.
多麼神奇的功能,讓視圖的改變直接反應到數據中,數據的改變又實時的通知到視圖,如何做到的?
這要歸功於 scope 以下3個重要的方法:
$watch
$digest
$apply
他們的差別是什麼,我們來介紹下:
$watch
這是一個監聽 scope 上資料的監聽器
方法說明:
$scope.$watch('参数',function(newValue,oldValue){ //逻辑处理 })
上面我們就是創建了一個監聽器.
‘參數' 就是$scope物件下的一個物件(或一個物件的屬性),注意,這裡是字串形式.
假如你要監聽 $scope.name 屬性.
$scope.$watch('name',function(newValue,oldValue){ //逻辑处理 })
如上代碼, ‘name' 需要引號
參數後面跟著回呼函數,回呼函數參數回傳了被監聽 屬性,變化後的新值,以前變化前的舊值.
$digest
他負責檢查 scope 中的資料是否發生了變化,如果某個屬性有變化,馬上會通知此屬性的監聽器 ($watch 註冊的監聽器),觸發監聽器,執行回調函數.
$apply
這個方法和 $digest 很相似, $digest 檢查scope 中的所有資料
$apply 相當於檢查 rootScope 中的所有資料,他會從父級到子級來檢查所有資料
$apply() == $rootScope.$digest()
$apply() 方法有兩種形式.
第一種 接受一個 function作為參數.
這樣觸發 $digest 函數並且執行一次 參數中的 function
第二種 不接受任何參數.
這樣只是觸發一輪 $digest 父級到子級的循環
Angular.js 中一班不會直接呼叫 $digest ,而是用 $scope.$apply() 來取代
我沒有設定監視器,為什麼視圖和資料可以雙向綁定
例如一個文字方塊 ng-model="name"
這時其實 $scope 物件下已經有了一個屬性 name 來對應和 上面的視圖進行雙向綁定
如何實現的?
其實,當我們定義 ng-model="name" 或 ng-bind="name" 或 {{name}}
這時 angular.js 會在 $scope 模型上自動為 “name” 屬性設定一個監聽器:
$scope.$watch('name', function(newValue, oldValue) { //监听 name 属性的变化 });
原來這裡 angular.js 幫我們自動建立了一個監聽器,所以此屬性和 $scope.name 資料才會即時的雙向綁定.
當然,有時候你也會發現明明資料變化了.但是UI 沒有刷新,是雙向綁定失效了嗎?
沒有
只是在 $scope 模型遍歷 digest 循環時,你的資料還沒回,
例如非同步呼叫方法,callbac 傳回的資料
例如你在 setTimeout 設定了定時觸發函數,然後修改模型資料
總之,是錯過了 $scope 模型的 digest 循環,導致模型沒有通知UI去根據新數據刷新.
遇到這樣的問題怎麼辦?
我們只好自己去手動呼叫 digest來循環檢查一次資料.實現雙向綁定
上面我們已經說過,通常不要去直接調用 digest 方法,而是手動調用 $apply 方法,間接實現觸發 $digest 循環.
如下:
setTimeout(function() { $scope.name= '一介布衣'; $scope.$apply(); }, 2000);
問題來了,上面時候該去手動調用 apply 方法
目前為止, angular.js 為一部分指令和服務自動實作了 $apply() 方法.
例如, ng-click ,ng-model ,$timeout服務,$http服務 等
呼叫後,angular.js 會自動幫我們呼叫 $apply() 來實作資料雙向綁定.

熱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)

你可能遇到過智慧型手機螢幕出現綠色線條的問題,即使沒看過,也一定在網路上看過相關圖片。那麼,智慧手錶螢幕變白的情況你有遇見過嗎? 4月2日,CNMO從外媒了解到,一名Reddit用戶在社群平台上分享了一張圖片,展示了三星Watch系列智慧手錶螢幕變白的情況。該用戶寫道:"我離開時正在充電,回來時就這樣了,我嘗試重啟,但重啟過程中屏幕還是這樣。"三星Watch智能手錶屏幕變白這位Reddit用戶並未指明這款智能手錶的具體型號。不過,從圖片上看,應該是三星Watch5。此前,另一位Reddit用戶也報告

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業務中用到的 monaco-editor 在 angular 中的使用,希望對大家有幫助!

隨著網路的快速發展,前端開發技術也不斷改進與迭代。 PHP和Angular是兩種廣泛應用於前端開發的技術。 PHP是一種伺服器端腳本語言,可以處理表單、產生動態頁面和管理存取權限等任務。而Angular是一種JavaScript的框架,可以用來開發單一頁面應用程式和建構元件化的網頁應用程式。本篇文章將介紹如何使用PHP和Angular進行前端開發,以及如何將它們

我們都知道監聽器的作用是在每次響應式狀態發生變化時觸發,在組合式API中,我們可以使用watch()函數和watchEffect()函數,當你更改了響應式狀態,它可能會同時觸發Vue組件更新和偵聽器回調。預設情況下,使用者建立的偵聽器回調,都會在Vue元件更新之前被呼叫。這表示你在偵聽器回呼中存取的DOM將是被Vue更新之前的狀態。那麼,我們來看一下,怎麼才能好好的運用他們呢?他們之間又有什麼差別呢? watch()函數watch需要偵聽特定的資料來源,例如偵聽一個ref,watch的第一個參數可以

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受

這篇文章帶大家了解Angular中的獨立元件,看看怎麼在Angular中建立一個獨立元件,怎麼在獨立元件中導入已有的模組,希望對大家有幫助!
