髒值檢查,經過digest遍歷全部的watcher,最終獲得統一的數據,再更新view。
髒值檢查Change Detection
內部的一個很是重要的階段——digest階段, 當系統進入此階段時,將會進行數據檢查, 它的處理流程以下:
- 標記dirty = false
- 遍歷全部經過component.$watch綁定的數據觀察者watcher, 對比當前值watcher.get(component)與老值watcher.last
- 若是值發生改變, 運行綁定的監聽器 - watcher.fn(newvalue, oldvalue), 並致使__dirty__=true. 設置watcher.last=newvalue
- 進入下一個watcher的檢查
- 遍歷檢查一輪後, 若是dirty===true, 咱們從新進入步驟1. 不然進入步驟4.
- 完成髒檢查
好, 如今咱們瞭解數據檢查的內部流程了, 可是什麼時候進入digest階段。
什麼時候進行髒檢查
當咱們對對象屬性進行賦值時, 咱們是沒法知道數據發生改變了的, 因此digest階段必然是 主動進入的 .
在regularjs中, digest階段是由$update方法觸發的.
var component = new Regular(); component.data.name = 'leeluolee' // you need call $update to Synchronize data and view component.$update();
值得慶幸的是,大部分狀況下都會自動進入digest階段.好比事件、timeout模塊等等.
<div on-click={blog.title='Hello'}>{blog.title}</div>
當點擊節點後, 內容區會變成Hello.
若是在angular上下文外改變了model,須要用到$apply來主動調用digest,通知angular來改變view
若是直接$apply,可能會報正處於digest中,因此能夠用$timeout,他能夠自動檢測到digest是否處於空閒中
- $timeout(function()
- {
- $scope.$apply(function()
- {
- $scope.message="1111";
- })
- )
$watch和$digest是相輔相成的。二者一塊兒,構成了Angular做用域的核心:數據變化的響應。
Angular做用域的本質:添加監聽器,在digest裏運行它們。