gpt4 book ai didi

ngrx/data- 如何编写自定义 reducer 来处理返回多个实体的端点?

转载 作者:行者123 更新时间:2023-12-05 01:34:23 25 4
gpt4 key购买 nike

我目前正在尝试将我的 ngrx 存储转换为使用 ngrx/data 来处理我的实体。我遇到的更棘手的障碍之一是处理返回多个实体数据的 API 端点。一个简单的例子 - 假设我有以下模型可以从我的 API 中检索:

export interface Parent {
id: string;
name: string;
}

export interface Child {
id: string;
name: string;
parent: string
}

我有以下端点:
/api/parents              #GET (list of parents), POST (create new parent)
/api/parents/<PARENT_ID> #GET, PATCH, PUSH, DELETE (a single parent)
/api/children #GET (list of children), POST (create new child)
/api/children/<CHILD_ID> #GET, PATCH, PUSH, DELETE (a single child)
/api/families #GET (all parents and children)
/api/families是一个方便的函数,它以以下格式返回所有父级和子级:

{
parents: Parent[];
children: Child[];
}

过去,我单独做了一个 families我的 ngrx 商店的条目,只包含加载/加载参数,然后是一组 LoadFamilies从服务器获取数据的操作。然后,我将这些操作包含在我的Parents 和Children 存储reducers 中,并适本地对它们进行操作。我现在想要做的是将这个额外的 reducer 添加到我现有的 ngrx/data 控制实体中。关于如何解决这个问题的任何想法/示例代码?

最佳答案

扩展 DefaultDataServicehttps://ngrx.io/guide/data/entity-dataservice#custom-entitydataservice

在管道内将嵌套数据映射到实体(我使用 normalizr)

然后使用 EntityActionFactory as eaFactory 调度实体缓存操作根据您的需要更新商店

与 Parent <--> Child of ConcreteRecordHeader <--> ConcreteRecordLoad 的示例

  getById(key: string | number): Observable<ConcreteRecordHeader> {
return super.getById(key).pipe(
map((denorm: any) =>
this.categoryCacheService.normalizeCategory([denorm])
),
tap((norm: NormalizedCategories) => this.mergeQuerySet(norm)),
map((norm: NormalizedCategories) => this.pickEntities(norm)[0])
) as Observable<ConcreteRecordHeader>;
}

protected mergeQuerySet(norm: NormalizedCategories) {
console.log("⚠️ Merging server data ⚠️");
const options: EntityActionOptions = {
mergeStrategy: MergeStrategy.PreserveChanges
};
const data = norm.entities.concreteRecordLoads
? Object.values(norm.entities.concreteRecordLoads)
: [];
const action = this.eaFactory.create(
"ConcreteRecordLoad",
EntityOp.SAVE_UPSERT_MANY_SUCCESS,
data,
options
);
this.entityCacheDispatcher.dispatch(action);
}

protected pickEntities(norm: NormalizedCategories) {
return (norm.entities.concreteRecordHeaders
? Object.values(norm.entities.concreteRecordHeaders)
: []) as ConcreteRecordHeader[];
}


遗憾 this.entityCacheDispatcher.mergeQuerySet()不使用 mergeStrategy 这是要使用的自然 API。我打算为此提交 PR。

关于ngrx/data- 如何编写自定义 reducer 来处理返回多个实体的端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57530663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com