ngrx - ngrx EntityAdapter upsertMany 部分更新
问题描述
我有一个 EntityState,比方说 type Model
: EntityState<Model>
。
我有一个返回部分模型列表的 API。Partial<Model>[]
.
我想更新这个列表。对于商店/实体状态中已经存在的实体(当然与 id 匹配),我想更新所有当前属性。
对于不存在的实体,我想清空缺失的字段并添加这些实体。
实现这一目标的最佳方法是什么?关于适配器方法如何工作的文档非常少(https://ngrx.io/guide/entity/adapter#adapter-collection-methods)。
upsert
requires Model[]
,不接受Partial<Model>[]
,尽管文档暗示它以某种方式支持部分更新。
这些add
方法没有指定他们对现有的 id 匹配做什么......大概他们忽略了新项目并且不添加/替换?
如果列出的 ID 不存在,这些update
方法不会指示会发生什么。
我想我最好的选择可能是跟注addMany
,然后updateMany
为了得到我想要的行为,但似乎upsert
是为了这个目的。挑战可能是将这些Partial<Model>
类型映射到Model
实体状态中缺少的实例中......即为新条目清除缺失的字段。
想法/建议?谢谢!
解决方案
这是我暂时的解决方案,除非我从更了解 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);
}
推荐阅读
- javascript - 我如何获得按钮的排名
- c - CLion 解决方法使错误变得更糟
- swift - .NSCalendarDayChanged 仅在应用程序处于前台时观察到
- javascript - 让 i 总是等于 undefined 但 var i 是在 for 循环中定义的
- javascript - 正则表达式:试图在引号内抓取文本
- python - 递归更新变量
- vb.net - 在 VB.NET 中检查 Datareader 和 Connection 对象 NULL
- php - 如何使用 codeigniter 在数据库中搜索逗号分隔值
- java - Java swing 为什么当我在 JScrollpane 内的面板中绘制大量字符串时,它们会重叠?
- c# - 如何在 c# 中像引用类型一样使用委托