脏值检查

脏值检查,经过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里运行它们
 
 
相关文章
相关标签/搜索