开发者问题收集

Ngrx:调度预期对象

2022-04-20
585

在我的 Actions 中我有:

export const GetSwivlr = createAction(
  GET_SWIVLR,
  props<{ payload: Swivlr[] }>()
);......

在我的 Reducer 中我有:

export const reducer = createReducer(
  initialState,
  on(SwivlrActions.AddSwivlr, (state, { payload }) => {
    return adapter.addOne(payload, state)
  }),
  on(SwivlrActions.RemoveSwivlr, (state, { payload }) => {
    return adapter.removeOne(payload, state)
  }),
  on(SwivlrActions.GetSwivlr, (state, { payload }) => {
    return adapter.setAll(payload, state)
  })
);

在我的效果中我有:

export class SwivlrEffects {
  constructor(private crudService: CrudService,
    private readonly actions$: Actions
  ) { }

  public readonly getSwivlr$ = createEffect(() => 
     this.actions$.pipe(ofType(GetSwivlr),
      mergeMap(() => this.crudService.getAll<Swivlr[]>('endpointAddress').pipe(
        map(swivlr => ({ type: GET_SWIVLR, payload: swivlr})))),
      catchError((error: string | null) =>
         of(FailSwivlr))
    )
  );
}

最初,我的所有操作都被声明为函数而不是 const,并且我将每个操作作为 Action 而不是 createAction 返回。

使用调度程序将我的 Actions 声明为函数时不会导致任何错误:

this.store.dispatch({ type: GET_SWIVLR });

但是现在却导致错误,我想我只需要将调用更改为:

this.store.dispatch(GetSwivlr());

但是,这个 const 附加了一个 props。我相信成功调用我的 Api 后,效果中会填充以下内容。

有人可以建议我如何更改此调用吗?

我收到 2 个错误,第一个:

Error: Effect "SwivlrEffects.getSwivlr$" dispatched as invalid action: undefined

第二个错误:

TypeError: Dispatch expected an object, instead it received a function.

为了详细说明我组件中的 @Antons 答案,我现在有:

....
 tiles$: Observable<Swivlr[]> = this.store.select(state => state.tiles);

  returnval: Swivlr[];

  constructor(private store: Store<{tiles: Swivlr[] }>) {
    this.returnval = [];
  }

  ngOnInit() {
    this.store.dispatch(GetSwivlr({ payload: this.returnval }));
    }
....
2个回答

正如您在此处声明的那样:

export const GetSwivlr = createAction(
  GET_SWIVLR,
  props<{ payload: Swivlr[] }>()
);

您必须为您的操作提供有效载荷并像这样调度它:

this.store.dispatch(GetSwivlr({ payload: `here is your object with type Swivlr[]` }));
Anton Marinenko
2022-04-20

在您的效果中,您在完成操作后没有分派适当的操作。当您将操作更改为 createAction 版本时,您可能没有更新它。下面代码中的括号可能弄乱了 - 请注意。

它可能也应该是 SetSwivlr({ payload: swivlr })

getSwivlr$ = createEffect(() => 
    this.actions$.pipe(
        ofType(GetSwivlr),
        mergeMap(() => this.crudService.getAll<Swivlr[]>('endpointAddress').pipe(
          map(swivlr => GetSwivlr({ payload: swivlr })))), // <-- here
          catchError((error: string | null) => of(FailSwivlr))
    )
  );
}

另一点说明,从商店中进行选择时,您应该使用 ngrx.io/guide/store/selectors ,而不是在组件中执行 this.store.select(state => state.tiles)

Deitsch
2022-04-21