ngrx效果抛出“调度了无效的动作:未定义”

时间:2018-11-22 21:47:43

标签: angular ngrx ngrx-effects

在对话框响应的情况下,我具有注销确认的这种效果,但是出现以下错误:

  

错误错误:效果“ AuthEffects.logoutConfirmation $”调度了无效的操作:未定义

  

错误TypeError:动作必须是对象

效果如下:

@Effect()
logoutConfirmation$ = this.actions$
    .ofType<Logout>(AuthActionTypes.Logout)
    .pipe(
      map(action => {
        if (action.confirmationDialog) {
          this.dialogService
            .open(LogoutPromptComponent)
            .afterClosed()
            .pipe(
              map(confirmed => {
                if (confirmed) {
                  return new LogoutConfirmed();
                } else {
                  return new LogoutCancelled();
                }
              })
            );
        } else {
          return new LogoutConfirmed();
        }
      })
    );

它在激活确认对话框时起作用,我想这是对话框响应图的问题,一直试图理解它,但找不到方法。 有人对此有线索吗?

3 个答案:

答案 0 :(得分:2)

您的外部映射应该是mergeMap,因为您正在将操作映射到新的流(如果条件为真)。

您可以按以下步骤解决此问题:

import { of } from 'rxjs';
import {map, mergeMap } from 'rxjs/operators';

@Effect()
logoutConfirmation$: Observable<Action> = this.actions$
    .ofType<Logout>(AuthActionTypes.Logout)
    .pipe(
      mergeMap(action => {
        if (action.confirmationDialog) {
          return this.dialogService
            .open(LogoutPromptComponent)
            .afterClosed()
            .pipe(
              map(confirmed => confirmed ? new LogoutConfirmed():new LogoutCancelled())
            );
        } else {
          return of(new LogoutConfirmed());
        }
      })
    );

请注意,请始终声明效果的显式类型,以便在编译时(而不是运行时)出错。

答案 1 :(得分:0)

就我而言,我没有分发任何东西,因此将dispatch:false放在@effect()内解决了我的问题。

  

@Effect({dispatch:false})

答案 2 :(得分:0)

这种情况发生在您未在减速器中调用此动作类型时,您需要在减速器中使用与您在效果中使用的动作类型相同的动作来放置类似内容:

case AuthActionTypes.Logout:
            return {
                ...state
            };

@Stephen Romero的答案会起作用,但它将忽略调度新值