如何在不通过服务传递属性“类型”的情况下将效果与元数据一起使用?

时间:2020-05-13 03:58:40

标签: angular ngrx

我正在学习ngrx,并尝试使用元数据作为示例(我正在遵循NgRx文档),我的问题是我的服务正在接收我的操作类型,并且我只需要有效负载。

我尝试过的事情:

在我的组件中,我通过用户对象进行了调度:

public save() {
  const user: Usuario = this.formGroup.value;
  this.store.dispatch(saveUser(user));
}

这是我的动作

export const saveUser = createAction('[Users API] Save User', props<Usuario>());

这是处理此操作的效果:

public saveUser$ = createEffect(() =>
  this.actions$.pipe(
    ofType(saveUser),
    mergeMap((action) => this.usuarioService.save(action))
  )
);

这是我的服务

public save(data: T): Observable<any> {
  console.log(data);
  return this.http.post<any>(`${this.apiPath}`, data);
}

我的问题是我的服务正在接收我的操作类型,我只需要对象用户:

{
  "id": null,
  "nome": "naaame",
  "cidade": "ciiity",
  "type": "[Users API] Save User"
}

我尝试在操作中传递一个对象:

this.store.dispatch(saveUser({ user: user }));

但是我的服务是一个抽象类,我在我的服务中扩展了该类以减少重复的代码,因此,在该类中,我不能使用data.user,因为其他服务也扩展了该类并使用相同的功能{{ 1}}。

我还试图从对象中删除类型,并在不执行此操作的情况下返回服务:

save()

这样,我的服务不会收到type属性,但是我收到了来自ngrx的错误消息:

错误错误:效果“ UsuarioEffects.saveUser $”调度了无效的 动作:{“ id”:5,“ nome”:“ wwww”,“ cidade”:“ wewe”}

ERROR TypeError:操作必须具有type属性

1 个答案:

答案 0 :(得分:2)

public saveUser$ = createEffect(() =>
  this.actions$.pipe(
    ofType(saveUser),
    mergeMap((action) => this.usuarioService.save(action.Usuario))
  )
);