Angular 变化检测:如何只刷新某些项目?
Angular change detection: how to refresh only certain items?
假设我的屏幕上有 100 个 div 由 *ngFor
生成,它从我的对象中获取值,该对象具有
之类的数据
{A1: someObject, A2: someOtherObject..., J10: someOtherOtherObject}
我点击 A1,然后点击 J10,它们会切换它们的值。改为:
{A1: someOtherOtherObject, A2: someOtherObject..., J10: someObject}
如何强制 Angular 仅刷新两个仅保存 A1 和 J10 值的 div?我正在使用 ChangeDetectionStrategy.OnPush
,在构造函数中我有 cd.detach()
并且仅在发生第二次单击时才调用 cd.detectChanges()
。从我所看到的和能够理解的情况来看,每个 div 都会触发它们的 *ngIf
所以它们中的每一个都会被重新创建。
我能做些什么来 a) 覆盖正在刷新的内容或 b) 选择检测更改的内容吗?
如果您 track the items 在您的列表中,*ngFor="let item of items; trackBy: trackById"
。
然后它不会再次渲染所有项目。
trackById = trackBy('id');
...
export function trackBy(field: string): (_index: number, item: any) => string | number {
return (_index: number, item: any) => {
if (!item) {
return null;
}
return item[field] as (string | number);
};
}
假设我的屏幕上有 100 个 div 由 *ngFor
生成,它从我的对象中获取值,该对象具有
{A1: someObject, A2: someOtherObject..., J10: someOtherOtherObject}
我点击 A1,然后点击 J10,它们会切换它们的值。改为:
{A1: someOtherOtherObject, A2: someOtherObject..., J10: someObject}
如何强制 Angular 仅刷新两个仅保存 A1 和 J10 值的 div?我正在使用 ChangeDetectionStrategy.OnPush
,在构造函数中我有 cd.detach()
并且仅在发生第二次单击时才调用 cd.detectChanges()
。从我所看到的和能够理解的情况来看,每个 div 都会触发它们的 *ngIf
所以它们中的每一个都会被重新创建。
我能做些什么来 a) 覆盖正在刷新的内容或 b) 选择检测更改的内容吗?
如果您 track the items 在您的列表中,*ngFor="let item of items; trackBy: trackById"
。
然后它不会再次渲染所有项目。
trackById = trackBy('id');
...
export function trackBy(field: string): (_index: number, item: any) => string | number {
return (_index: number, item: any) => {
if (!item) {
return null;
}
return item[field] as (string | number);
};
}