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

标签 angular ngrx angular-ngrx-data

使用 @ngrx/数据 我想处理 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

我的理解是为每个提供 EntityCollectionDataService 的实体创建和注册一个默认 reducer 。与 add / delete / getAll / getById / getWithQuery / update 的接口(interface)方法。

我想保留这些方法但覆盖 getWithQuery reducer 来达到我的目的。

这在 Customizing Entity Reducer Behavior 中有所提及

But quite often you'd like to extend a collection reducer with some additional reducer logic that runs before or after.



这怎么能做到呢?

如果我尝试覆盖 getWithQuery,我仍然会收到上述错误在我的PurchaseOrderService
  getWithQuery(params) {
    return super.getWithQuery(params).pipe(tap(result => console.log(result)));
  }

最佳答案

使用自定义 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 }), 一起导入

关于angular - @ngrx/data - 如何扩展集合缩减器/替换对数据服务调用结果的处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59073752/

相关文章:

javascript - 计算链中除combineLatest之外的其他运算符以避免冗余计算

angular - 尽管 DELETE 出错,实体仍从缓存中移除

angular - 实体未在@ngrx/data 中更新

AngularFireDatabase、Jest 和单元测试,如何创建可重用的类 stub ?

javascript - 在组件 [Angular] 中加载 Google Maps JS API

angular - 实现忘记密码功能

javascript - 将 NGRX 添加到 Mac OS 上的 Angular 应用程序时出现 Node-gyp 重建错误

javascript - 如何在 ionic 4 中为图像添加预加载器背景

angular - 如何在功能模块内使用@ngrx/router-store