Я новичок в ngrx / store, и это мой первый проект, использующий его.
Я успешно настроил свой проект angular с помощью ngrx / store, и я могу отправить действие загрузки после инициализации моего основного компонента следующим образом:
ngOnInit() { this.store.dispatch({type: LOAD_STATISTICS}); }
Я настроил эффект для загрузки данных при отправке этого действия:
@Effect()
loadStatistic = this.actions.ofType(LOAD_STATISTICS).switchMap(() => {
return this.myService.loadStatistics().map(response => {
return {type: NEW_STATISTICS, payload: response};
});
});
Мой редуктор выглядит так:
reduce(oldstate: Statistics = initialStatistics, action: Action): Statistic {
switch (action.type) {
case LOAD_STATISTICS:
return oldstate;
case NEW_STATISTICS:
const newstate = new Statistics(action.payload);
return newstate;
....
Хотя это работает, я не могу понять, как использовать это с защитой маршрутизатора, поскольку в настоящее время мне нужно отправить LOAD_ACTION только один раз.
Кроме того, то, что компонент должен отправить действие LOAD для загрузки исходных данных, мне не подходит. Я ожидал, что сам магазин знает, что ему нужно загрузить данные, и мне не нужно сначала отправлять действие. Если бы это было так, я мог бы удалить метод ngOnInit () в своем компоненте.
Я уже изучал приложение ngrx-example-app, но я не понял, как это работает.
РЕДАКТИРОВАТЬ:
После добавления защиты разрешения, которая возвращает наблюдаемое хранилище ngrx, маршрут не активируется. Вот решение:
@Injectable()
export class StatisticsResolver implements Resolve<Statistic> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Statistic> {
// return Observable.of(new Statistic());
return this.store.select("statistic").map(statistic => {
console.log("stats", statistic);
return statistic;
});
}
Это маршрут:
const routes: Routes = [
{path: '', component: TelefonanlageComponent, resolve: {statistic: TelefonieStatisticResolver}},
];