在我的主要组件中,我开始初始化我的数据:
_store.dispatch(_statusActions.initialize());
这会触发所有初始化操作:
@Effect()
loading$ = this.actions$
.ofType(StatusActions.INITIALIZING)
.mergeMap(() => Observable.from([
this._characterActions.initCharacters(),
this._vehicleActions.initVehicles()
]))
在商店中加载数据后,所有商店实体都会触发成功操作。
对于车辆:
@Effect()
loadVehicles$ = this.actions$
.ofType(VehicleActions.INIT_VEHICLES)
.switchMap(() => this._vehicleService.getVehicles()
.map((vehicles: Vehicle[]) => this._vehicleActions.initVehiclesSuccess(vehicles))
.catch(err => Observable.of(this._statusActions.dataLoadingError('vehicles')))
);
对于字符:
@Effect()
loadVehicles$ = this.actions$
.ofType(CharacterActions.INIT_CHARACTERS)
.switchMap(() => this._characterService.getCharacters())
.map((characters: Character[]) =>
this._characterActions.initCharactersSucess(characters))
最后,在触发所有 *_DATA_SUCCESS 操作之后,我希望触发我的 INITIALIZED 操作以将 READY 标志放入我的存储中。
export const initReducer = (state: boolean = false, action: Action): boolean => {
switch (action.type){
case StatusActions.INITIALIZING:
return false;
case StatusActions.INITIALIZED:
console.log('App initialized...');
return true;
default:
return state;
}
我的问题 - 如何执行?如何知道何时触发了所有成功操作?
UPD
Snks mtx,我跟着你的第一个和更快的广告。
很抱歉有额外的问题,但我真的一直在寻找下一步的好方法。如何保持这个订阅(在组件内部)直到我的 INITIALIZED 动作被触发(需要用 if(vehicles.length>0) 移除这个可怕的拐杖):
constructor(
...
) {
this.vehicles$ = _store.select(s => s.vehicles);
this.initialized$ = _store.select(s => s.initilized);
}
ngOnInit() {
let id = this._route.snapshot.params.id ? this._route.snapshot.params.id :
null;
this.sub = this.vehicles$.subscribe(vehicles => {
if (vehicles.length > 0){
if(id){
this.vehicle = vehicles.find(item => item.id === Number(id))
} else {
this.vehicle = new Vehicle(vehicles[vehicles.length-1].id+1, '');
}
this.viewReady = true;
}
})
}
ngOnDestroy(){
this.sub && this.sub.unsubscribe();
}
我试图在subscribe() 之前插入 skipUntil( ),但现在我从另一个组件打开这个组件时遇到问题(当所有数据都已经加载时)。在这种情况下,订阅回调不能再触发了!我无法理解为什么...
...
private initDone$ = new Subject<boolean>();
...
this.initialized$.subscribe((init: Init) => {
if(init.app)
this.initDone$.next(true);
})
this.sub = this.vehicles$.skipUntil(this.initDone$).subscribe(vehicles => {
if(id)
this.vehicle = vehicles.find(item => item.id === Number(id))
else
this.vehicle = new Vehicle(vehicles[vehicles.length-1].id+1, '');
this.viewReady = true;
});
}
要重现我的问题,只需按下列表中的一辆车。订阅回调未触发。然后按 F5 -> now vehicle loading,因为回调按设计触发。
完整的源代码在这里:GitHub ,在 GitHub Pages上运行的最后一个版本