Fel*_*lix 5 angular ngzone angular-changedetection angular-ngzone
我有一个一般性的角度问题:
为什么async
使用角管cdr.markForCheck()
而不是cdr.detectChanges()
?
我认为这两种“风格”有两个主要区别:
markForCheck()
标记要检查的路径直到根组件 -要更新的内容markForCheck()
让变化检测发生在当前或下一个周期 -计时我的想法或问题:
为什么我们需要检查根的整个路径(在async
管道中)?为什么不只是当前组件?( ) - 这与要更新的内容detectChanges()
有关
为什么只标记(对于当前/下一个周期 - 使用markForCheck()
ngZone)?为什么不立即检测变化?( ) 这与时间detectChanges()
有关
如果没有 ngZone 异步触发器/没有异步操作怎么办?那么视图更新不会发生吗?
async
如果我们改为使用管道会发生什么detectChanges()
?
异步管道:
private _updateLatestValue(async: any, value: Object): void {
if (async === this._obj) {
this._latestValue = value;
this._ref.markForCheck();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
async
请不要解释每种方法的作用,因为我在文档中阅读了很多次,并且从角度来看我无法理解。对我来说,重要的是要知道更新内容和时间安排的原因。
如需正确的文档,请检查ChangeDetectorRef
检查此视图及其子视图
如果你的类已更改,但视图尚未更新,则需要通知 Angular 来检测这些更改。
当视图使用 OnPush (checkOnce) 更改检测策略时,显式地将视图标记为已更改,以便可以再次检查。
仅从文本中您就可以看出,该策略用于组件检测策略已更改的情况onPush
(例如,如果 an@Input()
已更改)。
直接回答您的问题:
为什么我们需要检查根的整个路径(在异步管道中)?为什么不只是当前组件?(detectChanges()) - 这与要更新的内容有关
为什么只标记(对于当前/下一个周期 - 在 markForCheck() 中使用 ngZone)?为什么不立即检测变化?(DetectChanges())这与计时有关
我认为这是一个与性能相关的主题。收集需要运行的所有检查并在下一个周期中执行它们。
如果没有 ngZone 异步触发器/没有异步操作怎么办?那么视图更新不会发生吗?
正确,如果 Angular 不会收到通知,那么视图中不会发生任何变化
如果我们将异步管道更改为使用 detectorChanges() 会发生什么?
我想它也可以工作,但它不是只检查更改,而是直接执行视图的更新。
归档时间: |
|
查看次数: |
2032 次 |
最近记录: |