【问题标题】:How to use ngFor trackBy but notify about component input change?如何使用 ngFor trackBy 但通知组件输入更改?
【发布时间】:2019-09-13 09:35:57
【问题描述】:

<div *ngFor="let obj of objs; trackby:objToId">
  <sample-component [obj]="obj"></sample-component>
</div>

实际行为:

  • sample-component 不会收到有关 obj 属性更改的通知。

期望的行为:

  • sample-component 应该被通知任何 obj 属性更改而无需重新渲染组件。

如何实现期望的行为?

【问题讨论】:

  • 尝试删除 trackBy
  • @federicoscamuzzi 如果我删除它,整个组件将被重新初始化,这将重置其中的表单输入。我希望它只收到有关输入更改的通知,而不是重新渲染。
  • 您如何更改数据?你是在改变对象,还是覆盖它们?所以:objs[n].someProperty = newValue,还是objs[n] = someNewObject
  • @mbojko 我正在改变对象,因为 objs 来自 ngxs 状态。

标签: angular ngfor


【解决方案1】:

如果您要更改 obj 的某些属性,Angular 的更改检测不会注意到这一点(进行浅比较),trackBy 在这里是无罪的。

尝试覆盖整个obj,这样对象引用就会改变。因此,例如,而不是

objs[n].someProperty = newValue;

objs[n] = Object.assign({}, objs[n], { someProperty: newValue });

【讨论】:

  • 我正在按照描述改变整个对象,但这并不能解决问题,ngFor 不会通知 sample-component 有关输入更改。
  • 能否请您提供进行更改的代码?
  • 如果您更改obj.prop = X,它不会做。你应该做的是obj = { ...obj, prop : 'X'}
  • @mbojko 进行更改的代码是使用 ngxs 的动作调度。 objs 是状态选择器订阅的结果
  • @Stavm 即使你的建议也不能解决问题,因为 trackBy 只检查 id,如果它们相同,它认为没有理由通知 sample-component 这是 trackBy 的奇怪行为跨度>
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 2021-03-12
  • 2018-09-27
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2021-10-02
相关资源
最近更新 更多