我想要实现设置全局状态,同时也从api请求数据并将其存储在状态中,但是在全局状态以外的另一个位置。Angular 2作为更新某个状态的副作用更新全局状态
我打电话这种效果(models.effects.ts
):
@Effect() models$: Observable<Action> = this.actions$
.ofType(GET_MODELS)
.switchMap(() => this.modelsApi.getModels())
.map(models => ({type: SET_MODELS, payload: models}))
.catch((err: any) => Observable.of({type: GET_FAILURE, payload: {error: err}}))
现在我想做的事情是这样的:
@Effect() models$: Observable<Action> = this.actions$
.ofType(GET_MODELS)
.do(() => this.store.dispatch({type: 'SET_LOADING_STATE', payload: true}))
.switchMap(() => this.modelsApi.getModels())
.map(models => ({type: SET_MODELS, payload: models}))
.do(() => this.store.dispatch({type: 'SET_LOADING_STATE', payload: false}))
.catch((err: any) => Observable.of({type: GET_FAILURE, payload: {error: err}}))
正如你可以看到我们派出一个电话在globalReducer
():
export const GlobalReducer: ActionReducer<any> = (state: IGlobalStorage = {isLoading: false}, action: Action) => {
switch(action.type) {
case SET_LOADING_STATE: return Object.assign({}, state, {
isLoading: action.payload
});
default: return state;
}
}
这意味着塔t我们在发出http请求之前和之后更新全局状态isLoading
。然而,这个解决方案既混乱又不起作用,因为它打破了效果这个简单的事实(无论出于何种原因,我认为这是因为我在调用中调用了dispatch)。
最好我想创建另一个效果,它倾听SET_LOADING_STATE
然后调用globalReducer
本身,而不是让models$
效果直接做。
像这样的东西(从内global.effects.ts
):
@Effect() loadingState$: Observable<Action> = this.actions$
.ofType(SET_LOADING_STATE)
.do(() => ({type: SET_LOADING_STATE, payload: thePayloadThatWasSent}))
但也有2个问题与:
- 我不知道如何在一个效果访问发送有效载荷。
- 我不知道如何从
models$
效果中调用该效果。
总的来说,我只是很困惑如何实现我想要的,并且根据我所能找到的,没有任何这方面的例子。
如果你看一下这个图片,我想更新global.isLoading
当我更新models
:
什么会达到我想要的东西的最佳方式?