Ngrx:调度预期对象
在我的 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 }));
}
....
正如您在此处声明的那样:
export const GetSwivlr = createAction(
GET_SWIVLR,
props<{ payload: Swivlr[] }>()
);
您必须为您的操作提供有效载荷并像这样调度它:
this.store.dispatch(GetSwivlr({ payload: `here is your object with type Swivlr[]` }));
在您的效果中,您在完成操作后没有分派适当的操作。当您将操作更改为
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)
。