Angular 2 : *ngFor does not update when array is updated

标签 angular angular2-changedetection

我有一个对象数组(我们称之为arr)。在我的组件输入之一的 (change) 方法中,我修改了这些对象的属性之一,但在 View (*ngFor) 中没有任何变化。我读到 Angular2 变化检测不检查数组或对象的内容,所以我尝试了这些:

this.arr = this.arr.slice();

this.arr = [...this.arr];

但是 View 没有改变,它仍然显示旧的属性。在带有 console.log()(change) 方法中,我得到了正确的数组。很奇怪,但是这个有效:this.arr = []; 我也尝试了 NgZonemarkForCheck()

最佳答案

您还可以在 *ngFor 表达式中使用 trackBy 选项,为数组中的每个项目提供唯一 ID。这确实让你 100% 负责变化检测,所以每次数组中的项目发生变化时更新这个(唯一的)属性。如果数组中的任何项目已被赋予不同的 trackBy 属性,Angular 将仅重新呈现列表:

*ngFor="let item of (itemList$ | async); trackBy: trackItem"

或:

*ngFor="let item of itemList; trackBy: trackItem"

哪里:

trackItem 是您组件中的公共(public)方法:

public trackItem (index: number, item: Item) {
  return item.trackId;
}

关于 Angular 2 : *ngFor does not update when array is updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45239739/

相关文章:

node.js - 面向 Android 12 及更高版本的应用需要为 `android:exported` [Cordova] 指定显式值

javascript - 在模板中使用 Angular Reactive Forms .get() 方法会导致不必要的方法调用,如组件方法吗?

Angular 变化检测 ExpressionChangedAfterItHasBeenCheckedError

angular - 为什么需要使用默认更改检测策略调用 detectChanges()?

angular - 防止在 Angular Firebase 注销后在浏览器控制台中写入错误

Angular:setErrors 在循环内不起作用

javascript - 在 Angular 应用程序中的网络请求之前对空对象使用条件检查

angularjs - 为什么 Zone.js 会改变 AngularJS 评估属性的方式?

angular - angular 2 中的 behaviorSubject,它是如何工作的以及如何使用它

javascript - 如何调试 "Expression Changed After It Has Been Checked"错误?