Предположим, у меня есть следующая конфигурация маршрута:
export const appRoutes: Routes =
[{ path: '', component: MainComponent, canActivate: [AuthGuard], resolve: {session: SessionResolveGuard}, children: [
{ path: '', component: DashboardComponent},
// other "normal" paths not relevant now
{ path: 'nst', loadChildren: () => import('./nst/nst.module').then(m => m.NSTModule), data: { preload: true }},
{ path: 'rp', loadChildren: () => import('./rp/rp.module').then(m => m.RPModule), data: { preload: true }},
{ path: 'pf', loadChildren: () => import('./pf/pf.module').then(m => m.PFModule), data: { preload: true }},
]};
@NgModule({
exports: [RouterModule],
imports: [RouterModule.forRoot(appRoutes, { preloadingStrategy: EvoPreloadStrategyService })]
})
export class AppRoutesModule { }
мой режим предварительной загрузки довольно прост (вроде псевдокода):
@Injectable()
export class EvoPreloadStrategyService implements PreloadingStrategy {
constructor(private userSession: UserSessionService) {}
preload(route: Route, loadModule: () => Observable<any>): Observable<any> {
// "preload" every module that has a specific property and that is enabled for the user
if (route.data && route.data['preload'] && userSession.currentSession.shouldLoad[route.path] === true)
return loadModule();
else
return of(null);
}
}
Свойство userSession.currentSession.shouldLoad
зависит от текущее состояние сеанса и содержит все включенные модули для пользователя (например, он может содержать {'pf': true, 'nst': true, 'rp': true}
).
Однако свойство имеет значение dynamici c: в каждый момент Новый модуль может быть добавлен для пользователя, даже если это не во время bootstrap приложения.
Исходя из этих соображений, как я могу программно перезапустить стратегию предварительной загрузки (при каждом изменении свойства shouldLoad
) в Angular 8?
Возможно ли это?