NgRx Data - 如何以类型安全的方式挂钩 addOne 成功操作?

And*_*len 5 typescript ngrx angular angular-ngrx-data angular8

我是新手@ngrx/data,正在查看文档。

使用该指南,我已经能够复制以前手动完成的操作 - 例如,使用此概述页面上的服务,以下工作调用 REST-API 并将供应商添加到商店。

组件.ts

  onSave(supplier: Supplier) {
    this.supplierService.add(supplier);
  }
Run Code Online (Sandbox Code Playgroud)

我知道为了达到效果,我可以执行以下操作:

  hello$ = createEffect(
    () =>
      this.actions$.pipe(
        ofType('[Supplier] @ngrx/data/save/add-one/success'),
        tap(console.log)
      ),
    { dispatch: false }
  );
Run Code Online (Sandbox Code Playgroud)

但是 - 是否有一种类型安全的方法来挂钩成功的 API 调用操作/实体操作?

更新-澄清

我正在使用@ngrx/data所以我不会直接自己创建操作以及类型的导出。

成功添加供应商后 - 在 http 调用后会产生以下类型的操作:'[Supplier] @ngrx/data/save/add-one/success'- 我想要执行效果。除了使用字符串'[Supplier] @ngrx/data/save/add-one/success'(如上所示)之外,还有类型安全的钩子吗?

以前(当我自己创建操作时)我会导出联合类型并执行ofType(supplierActions.addSupplier)

更新 - 更接近答案

找到了ofEntityTypeofEntityOp这让我更接近我的目标,因为这些工作如下ofType

  hello$ = createEffect(
    () =>
      this.actions$.pipe(
        ofEntityType('Supplier'),
        ofEntityOp(EntityOp.SAVE_ADD_ONE_SUCCESS),
        tap(console.log)
      ),
    { dispatch: false }
  );
Run Code Online (Sandbox Code Playgroud)

现在只需找到一种'Supplier'entityMetadata

const entityMetadata: EntityMetadataMap = {
  Supplier: {}
};
Run Code Online (Sandbox Code Playgroud)

小智 1

你可以这样做:

\n\n
let array = Object.keys(entityConfig.entityMetadata);\n
Run Code Online (Sandbox Code Playgroud)\n\n

它将返回您的实体的名称,在本例中为 \xe2\x80\x9cSupplier\xe2\x80\x9d。\n然后只需使用该数组作为 ofEntityType 的参数

\n\n
hello$ = createEffect(\n    () =>\n      this.actions$.pipe(\n        ofEntityType(array),\n        ofEntityOp(EntityOp.SAVE_ADD_ONE_SUCCESS),\n        tap(console.log)\n      ),\n    { dispatch: false }\n  );\n
Run Code Online (Sandbox Code Playgroud)\n