angular脏值检测
Angular变更检测周期
- 开发人员更新数据模型,例如通过更新组件绑定
- angular 检测变化
- 变更检测从上到下检查组件树中的每个组件,以查看相应的模型是否已更改
- 如果有新值,它将更新组件的视图(DOM)
Angular使用Zone.js跟踪拦截异步任务。当发生任何用户事件,计时器,XHR,promise等, 回调会触发检测。
变更检测策略
Angular提供了两种策略来运行更改检测:
Default(从上到下检查组件树中的每个组件)
OnPush (当输入属性已更改/该组件或其子组件触发事件处理/通过异步管道链接到模板的可观察对象发出新值, 如 data | async/手动触发时触发检测。 当settimeout, setInterval, Promise.resolve().then(),this.http.get(‘..’).subscribe()不会触发变更检测)
手动触发检测的方法
ChangeDetectorRef的detectChanges() 通过牢记更改检测策略在此视图及其子级上运行更改检测。它可以与detach() 结合使用以实现本地更改检测检查。(说明: detach()停用变更检测)
ApplicationRef.tick() 通过遵守组件的更改检测策略来触发整个应用程序的更改检测
ChangeDetectorRef上的markForCheck() 不会触发更改检测,但会将所有OnPush祖先标记为要检查一次,作为当前或下一个更改检测周期的一部分。即使已标记的组件使用OnPush策略,它也将运行更改检测