使用 @ ngrx / data ,我想以不同的方式处理getWithQuery
API调用的结果。
当前如果会返回一个实体数组,则会直接将其加载到entityCache
中。
到目前为止,我已经使用了overview中显示的标准模式:
export const entityMetadata: EntityMetadataMap = {
PurchaseOrder: {}
};
@Injectable({
providedIn: "root"
})
export class PurchaseOrderService extends EntityCollectionServiceBase<
PurchaseOrder
> {
constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
super("PurchaseOrder", serviceElementsFactory);
}
}
相反我想处理以下API响应,并将entities
加载到EntityCache中,就像普通的getWithQuery
会将total
粘贴在其他位置一样我的商店。
{
"entities": [{...}, {...}, ..., {...}], // list of entities
"total": 100
}
如果返回此API响应,自然会出现以下错误:
我的理解是,为每个提供add / delete / getAll / getById / getWithQuery / update
方法的EntityCollectionDataService接口的实体创建并注册了一个默认的reducer。
我想保留这些方法,但重写getWithQuery
减速器以达到我的目的。
Customizing Entity Reducer Behavior
中提到了这一点但是很多时候,您都希望使用在运行之前或之后运行的其他附加reducer逻辑来扩展collection reducer。
这实际上如何完成?
如果我尝试覆盖getWithQuery
中的PurchaseOrderService
,仍然会出现上述错误
getWithQuery(params) {
return super.getWithQuery(params).pipe(tap(result => console.log(result)));
}
答案 0 :(得分:0)
设法使用自定义EntityDataService
@Injectable()
export class PurchaseOrderDataService extends DefaultDataService<
PurchaseOrder
> {
constructor(
http: HttpClient,
httpUrlGenerator: HttpUrlGenerator,
logger: Logger,
config: DefaultDataServiceConfig
) {
super("PurchaseOrder", http, httpUrlGenerator, config);
}
getWithQuery(params: string | QueryParams): Observable<PurchaseOrder[]> {
return super.getWithQuery(params).pipe(
tap(res => console.log(res)),
map((res: any) => res.entities)
);
}
}
然后需要注册:
@NgModule({
providers: [PurchaseOrderDataService] // <-- provide the data service
})
export class EntityStoreModule {
constructor(
entityDataService: EntityDataService,
purchaseOrderDataService: PurchaseOrderDataService
) {
entityDataService.registerService(
"PurchaseOrder",
purchaseOrderDataService
); // <-- register it
}
}
并将其与EntityDataModule.forRoot({ entityMetadata }),