Существует простой (Angular 4) сторож маршрута, который ожидает загрузки некоторых данных из бэкэнда:
@Injectable()
export class ContractsLoadedGuard implements CanActivate {
constructor(private store: Store<State>) { }
waitForData(): Observable<boolean> {
return this.store.select(state => state.contracts)
.map(contractList => !!contractList)
.filter(loaded => loaded)
.take(1);
}
canActivate(): Observable<boolean> { return this.waitForData(); }
}
Маршрутизация:
const routes: Routes = [
{ path: 'app-list', canActivate: [ContractsLoadedGuard], component: AppListComponent },
];
И, наконец, есть @ ngrx / effects, запускаемый действием @ ngrx / router-store v4 ROUTER_NAVIGATION
:
@Effect() routeChange$ = this.actions$
.ofType(ROUTER_NAVIGATION)
.filter((action: RouterNavigationAction) => action.payload.routerState.url.indexOf('/app-list') > -1)
.withLatestFrom(this.store.select(state => state.contracts))
.switchMap(([action, contracts]: ([RouterNavigationAction, ContractList])) =>
this.restClient.load(action.payload.routerState.queryParams, contract));
К сожалению, когда навигация изменяется на /app-list
, сначала выполняется эффект ngrx (перед охраной), и поэтому данные state.contracts
еще не доступны. Охрана еще не выполнена. Мне нужно добавить оператор .combineLatest()
Rx, чтобы также дождаться появления contracts
данных (это работа охранника):
@Effect() routeChange$ = this.actions$
.ofType(ROUTER_NAVIGATION)
.filter((action: RouterNavigationAction) => action.payload.routerState.url.indexOf('/app-list') > -1)
.combineLatest(this.contractListGuard.waitForContractsToLoad(), a => a) <- HERE
.withLatestFrom(this.store.select(state => state.contracts))
.switchMap(/* same here */)
Я не уверен, достаточно ли это хорошее решение. Должен быть способ сделать это лучше - не дублировать действующие функции защиты.
Подводя итог: при ускорении приложения мне нужно получить некоторые данные из бэкэнда - contracts
. Если пользователь переходит на /app-list
(немедленное перенаправление), с сервера извлекаются другие данные - на основе некоторых параметров запроса и contracts
- порядок выполнения маршрутизатора ngrx ROUTER_NAVIGATION
effect
предшествует порядку выполнения защиты. Как с этим справиться?
На основе GitHub - state_management_ngrx4