Angular 在没有不可变对象的情况下更改推送检测策略

Angular change detection strategy on push without immutable objects

我一直在阅读一些关于变更检测策略的文章,但我对在哪些情况下使用推送策略有意义有一些疑问。 基本上我的疑问是关于我们什么时候嵌套组件绑定了不可变的对象。我有两个嵌套组件,一个父组件和一个子组件,它们都具有推送时的更改检测策略。我将 formGroup 作为输入传递给子组件。

当我将表单设置为在父组件上启用,然后我调用 ChangeDetectorRef.detectChanges()(应该检查变化检测器及其子组件)时,我没有看到子组件上的变化(例如,子组件上的 ngIf 在启用表单时显示内容)。

我哪里做错了或者没理解好?

默认情况下,更新对象引用时更改检测为 运行,这就是为什么说更改检测仅在不可变对象上 运行。

当您的组件完全依赖于 Input() 绑定时,您必须使用 OnPush 更改检测策略。

您必须 运行 子组件中 ngDoCheck() 内的 ChangeDetectorRef 上的 markForChange() 方法。

使用 this link 从媒体进一步理解我的答案。

我已经为您提到的场景创建了一个项目并将其上传到 GitHub。您可以参考一下。