从组件分派(dispatch)操作时未调用ngrx效果

标签 ngrx ngrx-effects

我遇到了一个问题,ngrx 商店没有发送一个 Action 来达到应该处理它的效果。

这是尝试分派(dispatch)的组件:

  signin() {
    this.formStatus.submitted = true;
    if (this.formStatus.form.valid) {
      this.store.dispatch(new StandardSigninAction(this.formStatus.form.value.credentials));
    }
  }

行动:

export const ActionTypes = {
  STANDARD_SIGNIN: type('[Session] Standard Signin'),
  LOAD_PERSONAL_INFO: type('[Session] Load Personal Info'),
  LOAD_USER_ACCOUNT: type('[Session] Load User Account'),
  RELOAD_PERSONAL_INFO: type('[Session] Reload Personal Info'),
  CLEAR_USER_ACCOUNT: type('[Session] Clear User Account')
};

export class StandardSigninAction implements Action {
  type = ActionTypes.STANDARD_SIGNIN;

  constructor(public payload: Credentials) {
  }
}
...

export type Actions
  = StandardSigninAction
  | LoadPersonalInfoAction
  | ClearUserAccountAction
  | ReloadPersonalInfoAction
  | LoadUserAccountAction;

效果:

  @Effect()
  standardSignin$: Observable<Action> = this.actions$
    .ofType(session.ActionTypes.STANDARD_SIGNIN)
    .map((action: StandardSigninAction) => action.payload)
    .switchMap((credentials: Credentials) =>
      this.sessionSigninService.signin(credentials)
        .map(sessionToken => {
          return new LoadPersonalInfoAction(sessionToken);
        })
    );

我可以在调试中看到该组件确实调用了调度方法。我还可以确认 StandardSigninAction确实被实例化了,因为构造函数中的断点被命中。

但是 standardSignin$效果不叫...

什么可能导致不被调用的效果?

如何调试商店内正在发生的事情?

有人可以帮忙吗?

附言我在我的导入中运行上述效果如下:

EffectsModule.run(SessionEffects),

编辑 :这是我的 SessionSigninService.signin 方法(确实返回一个 Observable)

  signin(credentials: Credentials) {
    const headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'});
    const options = new RequestOptions({headers: headers});
    const body = 'username=' + credentials.username + '&password=' + credentials.password;
    return this.http.post(this.urls.AUTHENTICATION.SIGNIN, body, options).map(res => res.headers.get('x-auth-token'));
  }

最佳答案

如果您使用的是版本 8,请确保使用 createEffect 包装每个操作.

例子:

Create$ = createEffect(() => this.actions$.pipe(...))

关于从组件分派(dispatch)操作时未调用ngrx效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42962463/

相关文章:

Angular NGRX @Effect 捕获所有操作

rxjs - 链接 RxJS map 运算符和 ngrx 效果问题

angular - 取消 ngrx 效果中的计时器

angular - NgRx 对 switchMap 和 catchError 的影响 - 有人可以解释我的代码和 'correct' 代码之间可观察到的工作流的区别吗?

rxjs - 如何有条件地从 ngrx 中的效果分派(dispatch)多个 Action

angular - ngrx中的多个商店

angular - tap() 未在 RXJS 管道中触发

angular - 使用来自一个 ngrx store reducer 的 Observable 数据来过滤另一个结果

angular - ngrx 类型,@ngrx/effects

javascript - NGRX Action /效果上的多个有效负载