【问题标题】:Angular dynamic component loader change detection issue角度动态组件加载器更改检测问题
【发布时间】:2018-01-06 23:26:54
【问题描述】:

我正在尝试使用 angular dynamic component loader,但在使用 ChangeDetectionStrategy.OnPush 时遇到了更改检测问题。 我在this git issue 中阅读了它并看到了Plunker,据我了解,动态添加的组件与其父更改检测树分离,并且 onPush 不起作用(仅默认)。

我想知道是否有办法仍然使用 ChangeDetectionStrategy.OnPush。有没有办法将组件分配给某个树?现在我将所有相关组件从 onPush 更改为 Default 并且应用程序运行良好,但我更喜欢使用 onPush 策略。

【问题讨论】:

  • 据我了解,动态添加的组件与其父更改检测树分离 - 这不是真的,动态添加的组件的检查方式与静态组件相同模板when embedded views are checked

标签: angular angular2-changedetection


【解决方案1】:

每次更改组件的状态时,您都可以使用创建组件时获得的 ComponentRef 引用从父级调用更改检测。
在动态组件中应该没有区别。

【讨论】:

  • 我之前尝试过它并且它有效,但是它导致我对更改检测非常严格并且在每个组件中多次调用它。我正在寻找一种模拟动态组件的方法(就像静态组件一样)
  • 不确定您所说的“这导致我对更改检测非常严格并在每个组件中多次调用它”是什么意思。您可以创建属性 getter/setter 并在 setter 末尾调用 this.cdRef.markForCheck()。我也不明白你所说的“一种模拟动态组件的方法一直存在(像静态组件)”
  • Lats 说对于这个例子的提议,我有 20 个设置器,原因是要手动检查 20 个不同位置的更改。在静态组件中,onPush 触发本身的变化检测,无需在每次设置后手动检查。
  • 我不认为有办法自动执行此操作。 OnPush 仅在 @Input() 被更改检测更新时运行更改检测,而不是在属性更改时运行。动态添加的组件没有输入,因此在更新 @Input() 时无法进行 Angular 运行更改检测。
  • 所以基本上我必须使用默认更改检测或在 onPush 中自己触发它?
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2022-01-04
  • 2017-10-10
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多