变更检测
Angular 中,数据是由顶部根节点流向最后的叶子节点,整个数据流是单向,构成一颗单向树。
Angular 认为所有的异步操作都有可能会引起模型的变化,引起数据模型发生变化的事件源有:
- Events:click,mouSEOver,keyup ...
- Timers:setInterval、setTimeout
- XHRs:Ajax(GET、POST ...)
Angular 封装 Zone来拦截跟踪异步,一旦发现异步行为,Angular 就会进行变更检测。
因为数据流是单向的,组件的数据来源只能由父组件进行传入,所以 Angular 会从上到下,广度遍历检测组件,只要父组件检测完毕就能继续检测子组件。而相比 angularjs,双向、混乱的数据流方向,会导致重复变更检测重复多次,直到数据稳定,可能会导致性能问题,或者出现数据和视图处于不一致的状态,即渲染过程完成后的视图不能反映数据的实际状态。
渲染输出
当检测到数据模型变化时,组件需要重新渲染,Angular将运行它的 DOM 生成函数,该函数会生成一个新的 DOM数据结构,该结构对应于组件 View 的新版本。
Angular 在渲染过程中,评估模板表达式并在整个组件树中调用生命周期钩子。
注意:绿色标志会多次调用
从生命调用周期来看(绿色有向线),ngAfterViewChecked 标示该组件及子组件视图输出完成。看以下一例子:
ngAfterViewChecked() {
this.course.description += Math.random();
}
}