@ ngrx / data-如何扩展集合精简器/替换对数据服务调用结果的处理?

时间:2019-11-27 15:40:57

标签: angular ngrx angular-ngrx-data

使用 @ 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响应,自然会出现以下错误:

enter image description here

我的理解是,为每个提供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)));
  }

1 个答案:

答案 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 }),

一起导入