赞
踩
负责检测Angular组件中数据的变化,实时地更新视图。
Angular
会在发生异步操作(这些操作常常会引起数据改变)后,触发变更检测,实时地更新视图。
常见的异步操作有以下几种
基于zone.js
实现,,它能捕获异步操作。告诉Angular应用的状态可能已经改变了,在适当的时候触发变更检测机制。
只要有异步操作,就会触发变更检测。从根节点开始,从上到下遍历所有子组件(深度遍历)检测,直至最后一个组件达到稳定状态。
OnChanges
、OnInit
、DoCheck
、AfterContentInit
。`ngAfterViewInit
如果违背了变更检测执行顺序,那么就会报错NG0100: ExpressionChangedAfterItHasBeenCheckedError
。后果的例子待补充(比如:在子组件生命周期中,修改了父组件模板中使用到的值(包括子组件绑定的属性、模板使用到的<p>{{ name }}</p>
))。
CD:ChangeDetection
整个Angular应用是组件树
只要有异步操作,就会触发变更检测。从根节点开始,从上到下遍历所有子组件(深度遍历)检测,直至最后一个组件达到稳定状态。
若为组件设置了OnPush
策略,Angular的变更检测会跳过该组件及其子组件的检测。只有以下几种情况会触发该组件的变更检测:
@Input
)改变时,组件才进行变更检测DOM事件
触发时,才进行变更检测:从根组件开始往下遍历进行变更检测手动触发
变更检测(ChangeDetectorRef对象.detectChanges()
):从该组件开始往下遍历进行变更检测在我们创建了Angular应用
后,Angular
会创建一个ApplicationRef
的实例。它该应用根组件的引用
。主要负责启动应用、处理全局的变更检测和应用关闭时执行清理工作
bootstrap()
:启动应用将根组件挂载到DOM中tick()
:手动触发一次变更检测
NgZone
的onTurnDone
事件。当该事件触发时,执行tick()
触发变更检测// 真实源码的非常简化版本。
class ApplicationRef {
changeDetectorRefs:ChangeDetectorRef[] = [];
constructor(private zone: NgZone) {
this.zone.onTurnDone
.subscribe(() => this.zone.run(() => this.tick());
}
tick() {
this.changeDetectorRefs
.forEach((ref) => ref.detectChanges());
}
}
attachView()
和detachView()
:手动将视图附加到或分离出应用中isStable:Observable<boolean>()
:检测应用是否稳定Angular会为每个组件实例生成一个变更检测器,用于管理变更检测。
我们可以通过注入对象来获得
detectChanges()
: 手动触发1次变更检测markForCheck()
: 标记当前组件及其父组件为脏检测状态,但不立即执行变更检测,等待下一轮变更检测时执行detach()
: 从变更检测树中分离当前组件,即暂时停止对当前组件的变更检测reattach()
: 重新将当前组件添加到变更检测树中,恢复对当前组件的变更检测run()
: 在 Zone 外部运行变更检测,可以用于优化性能Polluting the zone happens when we run an initialization logic that uses requestAnimationFrame, setTimeout or addEventListener.
comes from 3p libraries with triggers
move initializations outside the Angular zone
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。