我试图找出我应该如何结合使用 ngrx-store 和 OnPush changedetection 策略。
假设我想在我的集合中设置一个选定实体的类。
如果我做这样的事情:
this.collection = Observable.combineLatest(
this.store.let(fromStore.getCollection),
this.store.let(fromStore.getSelected),
(c, s) => c.map(entity => {return { ...entity, isSelected : s.id === entity.id ? true:
false }));
或者如果我在减速器中设置 isSelected 属性,它会创建我所有实体的克隆。如果我这样做的话,会有大量的收藏:
<div *ngFor="let entity of collection| async;let i = index;trackBy:entity?.id"
[class.selected]="entity.isSelected">
它很慢!
但是,如果我不订阅这样的选择更改:
this.collection = this.store.let(fromStore.getCollection);
改变
<div ... [class.selected]="entity.isSelected">
至
<div ...[class.selected]="isSelected(entity.id) | async">
并创建一个获取选定对象的函数:
public isSelected(id): Observable<boolean> {
return this.selected && this.selected.find(s => !!s.id === id));
}
它很快
因此,如果流发生更改,使用流的组件似乎需要大量时间来检测 domchanges,即使没有。
那是对的吗?这意味着您必须非常清楚您在商店中所做的更改以及您应该在组件中执行的操作。