我将从我在 StackOverflow 上看到一个类似问题的概念开始这个问题,但那个问题只回答了差异。
我要问的是我应该根据情况使用什么以及一种或另一种方法可能有哪些缺点。
我知道detectChanges
在一个元素及其子元素上运行即时更改检测周期,同时markForCheck
只将当前元素及其祖先标记为脏,并且应该在下一个更改检测周期中检查它们。
我问这个主要是因为我觉得我不应该总是markForCheck
在异步调用中使用。
例如,我有一个InputComponent
它是常规 HTML 输入的包装器。这InputComponent
已ChangeDetectionStrategy.OnPush
启用。
当我对服务器进行异步调用并获取数据时,我需要对其运行更改检测InputComponent
以更新选项列表,我有两个选项。
首先(我觉得我应该使用的)是detectChanges
因为它只会对这个确切的组件应用检查,同时markForCheck
会导致检查整个树枝。
那么我应该使用什么,我需要使用markForCheck
什么,为什么?
到处都说 markForCheck 只是将当前组件视图和所有父组件(直到根组件)标记为脏组件。因此下次执行 DetectChanges 时它将更新视图。从这一点上我有两个问题。两者都在该组件具有的上下文中changeDetection: ChangeDetectionStrategy.OnPush
1)如果“async pipeline”除了调用markForCheck(源代码)什么都不做,为什么视图会更新?
2)如果我尝试在某个异步进程中调用markForCheck,视图也会更新。
演示:stackblitz
您能帮助我了解这些过程中发生的情况以及视图实际更新的原因吗?我期待有人在 1) 和 2) 之后调用 DetectChanges 方法,但是谁......