髒值檢查

髒值檢查,經過digest遍歷全部的watcher,最終獲得統一的數據,再更新view。
 
 
 
髒值檢查Change Detection
內部的一個很是重要的階段——digest階段, 當系統進入此階段時,將會進行數據檢查, 它的處理流程以下:
  1. 標記dirty = false
  2. 遍歷全部經過component.$watch綁定的數據觀察者watcher, 對比當前值watcher.get(component)與老值watcher.last
    • 若是值發生改變, 運行綁定的監聽器 - watcher.fn(newvalue, oldvalue), 並致使__dirty__=true. 設置watcher.last=newvalue
    • 進入下一個watcher的檢查
  1. 遍歷檢查一輪後, 若是dirty===true, 咱們從新進入步驟1. 不然進入步驟4.
  2. 完成髒檢查
好, 如今咱們瞭解數據檢查的內部流程了, 可是什麼時候進入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是否處於空閒中
  1. $timeout(function()
  2. {
  3. $scope.$apply(function()
  4. {
  5. $scope.message="1111";
  6. })
  7. )
 
 
$watch和$digest是相輔相成的。二者一塊兒,構成了Angular做用域的核心:數據變化的響應。
 
Angular做用域的本質:添加監聽器,在digest裏運行它們
 
 
相關文章
相關標籤/搜索