5

使用@ngrx/data我想以getWithQuery不同于默认的方式处理 API 调用的结果。

目前,如果这返回一个实体数组,则会entityCache直接加载。

到目前为止,我使用了概述中显示的标准模式:

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 响应,我自然会收到以下错误:

在此处输入图像描述

我的理解是,为每个提供EntityCollectionDataService接口和方法的实体创建并注册了一个默认减速器add / delete / getAll / getById / getWithQuery / update

我想保留这些方法,但覆盖getWithQuery减速器以实现我的目标。

这在自定义实体减速器行为中提到

但很多时候,您希望使用一些在之前或之后运行的附加 reducer 逻辑来扩展集合 reducer。

这怎么能做到呢?

如果我尝试在我的getWithQuery内部覆盖,我仍然会收到上述错误PurchaseOrderService

  getWithQuery(params) {
    return super.getWithQuery(params).pipe(tap(result => console.log(result)));
  }
4

1 回答 1

4

设法使用自定义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 }),

于 2019-11-27T16:38:14.453 回答