我是@ngrx/data
的新手,正在阅读文档。
使用guide,我已经能够复制以前手动完成的工作-例如,使用此概述页面上的service,以下工作将调用REST-API并将供应商添加到商店。
component.ts
onSave(supplier: Supplier) {
this.supplierService.add(supplier);
}
我知道可以做到以下几点:
hello$ = createEffect(
() =>
this.actions$.pipe(
ofType('[Supplier] @ngrx/data/save/add-one/success'),
tap(console.log)
),
{ dispatch: false }
);
但是-通常有没有类型安全的方法来插入成功的API调用操作/实体操作?
更新-澄清
我正在使用@ngrx/data
和,所以我不是在创建类型的同时直接自己创建动作。
在成功添加供应商后-在http调用后导致类型为'[Supplier] @ngrx/data/save/add-one/success'
的操作-我要执行一种效果。不是使用字符串'[Supplier] @ngrx/data/save/add-one/success'
(如上所示),而是使用类型安全钩子?
以前(当我自己创建动作时)我将导出一个联合类型并执行ofType(supplierActions.addSupplier)
更新-更接近答案
发现ofEntityType
和ofEntityOp
使ofType
之类的工作使我离目标越来越近:
hello$ = createEffect(
() =>
this.actions$.pipe(
ofEntityType('Supplier'),
ofEntityOp(EntityOp.SAVE_ADD_ONE_SUCCESS),
tap(console.log)
),
{ dispatch: false }
);
现在只想找到一种从'Supplier'
键入entityMetadata
的方法
const entityMetadata: EntityMetadataMap = {
Supplier: {}
};
答案 0 :(得分:1)
您可以执行以下操作:
let array = Object.keys(entityConfig.entityMetadata);
它将返回您实体的名称,在本例中为“ Supplier”。 然后只需将数组用作ofEntityType的参数
hello$ = createEffect(
() =>
this.actions$.pipe(
ofEntityType(array),
ofEntityOp(EntityOp.SAVE_ADD_ONE_SUCCESS),
tap(console.log)
),
{ dispatch: false }
);
答案 1 :(得分:0)
您可以查看我的完整代码here
下面是我的小样本
我将定义一个动作列表
export enum PostActionTypes {
LoadPosts = "[Post] Load Posts",
LoadPostsSuccess = "[Post] Load Posts Success",
LoadPostsFail = "[Post] Load Posts Fail",
LoadPost = "[Post] Load Post",
LoadPostSuccess = "[Post] Load Post Success",
LoadPostFail = "[Post] Load Post Fail",
UpdatePost = "[Post] Update Post",
UpdatePostFail = "[Post] Update Post Fail",
UpdateSelectedPost = "[Post] Update Selected Post"
}
export const LoadPosts = createAction(PostActionTypes.LoadPosts);
所以对我来说
getPosts$ = createEffect(() =>
this.actions$.pipe(
ofType(PostActions.LoadPosts),
switchMap(_ => {
return this.postService
.getPosts()
.pipe(
map(
(posts: IPost[]) => PostActions.LoadPostsSuccess({ posts }),
catchError(errors => of(PostActions.LoadPostsFail(errors)))
)
);
})
)
因此,在这种情况下,您可以轻松使用安全类型,而不是使用魔术字符串