首页 > 解决方案 > ngrx EntityAdapter upsertMany 部分更新

问题描述

我有一个 EntityState,比方说 type Model: EntityState<Model>

我有一个返回部分模型列表的 API。Partial<Model>[].

我想更新这个列表。对于商店/实体状态中已经存在的实体(当然与 id 匹配),我想更新所有当前属性。

对于不存在的实体,我想清空缺失的字段并添加这些实体。

实现这一目标的最佳方法是什么?关于适配器方法如何工作的文档非常少(https://ngrx.io/guide/entity/adapter#adapter-collection-methods)。

upsertrequires Model[],不接受Partial<Model>[],尽管文档暗示它以某种方式支持部分更新。

这些add方法没有指定他们对现有的 id 匹配做什么......大概他们忽略了新项目并且不添加/替换?

如果列出的 ID 不存在,这些update方法不会指示会发生什么。

我想我最好的选择可能是跟注addMany,然后updateMany为了得到我想要的行为,但似乎upsert是为了这个目的。挑战可能是将这些Partial<Model>类型映射到Model实体状态中缺少的实例中......即为新条目清除缺失的字段。

想法/建议?谢谢!

标签: ngrxngrx-entity

解决方案


这是我暂时的解决方案,除非我从更了解 ngrx 实体的人那里听到更好的选择。

interface IModel {
  id: string;
}

export function upsertMany<TApiType extends IModel, TStoreModel>(
  adapter: EntityAdapter<TStoreModel>,
  models: TApiType[],
  addMap: ((model: TApiType) => TStoreModel),
  updateMap: ((model: TApiType) => Partial<TStoreModel>),
  state: EntityState<TStoreModel>,
): EntityState<TStoreModel> {
  state = adapter.updateMany(models.map(model => ({
    id: model.id,
    changes: updateMap(model),
  })), state);
  return adapter.addMany(models.map(addMap), state);
}

推荐阅读