У меня проблема с навигацией по различным маршрутам.
У меня есть два разных модуля маршрута.
app.routes.ts:
Содержит только LoginPage:
export const routes: Routes = [
{
path: 'login',
component: LoginPageComponent,
canActivate: [PreventLoggedInAccess]
},
{
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
{
path: '**',
redirectTo: 'login'
}
];
export const Routing: ModuleWithProviders =
RouterModule.forRoot(routes, { useHash : true });
С PreventLoggedInAccess.canActivate, если пользователь уже зарегистрирован, он перенаправляет его в раздел с /app prefix и дочерним маршрутом home. Он определяется как:
canActivate(): boolean {
if (!this._authService.isAuthenticated()) {
return true;
}
this._router.navigate(['/app/home']);
return false;
}
pages.routes.ts:
Содержит все подпрограммы /app, доступные только в том случае, если пользователь вошел в систему. Это достигается с помощью AuthGuardService.canActivateChild:
export const pageRoutes: Routes = [
{
path: 'app',
component: PagesComponent,
canActivateChild: [AuthGuardService],
children: [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'home', component: HomePageComponent },
{ path: 'contents', component: ContentsComponent },
]
}
];
export const Routing: ModuleWithProviders = RouterModule.forChild(pageRoutes);
С последним, который перенаправляет /login если пользователь не вошел в систему. Он определяется как:
canActivateChild(): boolean {
if (this._authService.isAuthenticated()) {
return true;
}
this._router.navigate(['login']);
return false;
}
Когда я перемещаюсь из
app/homeвapp/contentsон переходит только кContentsComponentпосле двух раз. Итак, если я делаю два разаthis._router.navigate(['app/components']);он работает, если я делаю это только один раз, маршрут изменяется сapp/homeнаapp/routeна 1 мс, и он возвращается вapp/home, а если я делаю это во второй раз, он меняет маршрут. Хотя, если я вapp/contentsи пытаюсь перейти кapp/homeон меняет маршрут просто отлично.
isAuthenticated работает отлично. Оба authguards работают очень хорошо, поэтому, если я пытаюсь получить доступ к любому дочернему маршруту app когда я не зарегистрирован, я получаю перенаправление для входа в систему и если я пытаюсь получить доступ к login при login систему, я получаю перенаправление в app/home.
Мне удалось немного отладить, и я заметил следующий поток:
- Первая попытка -
app/home→app/contents:-
navigate(['app/contents'])вызывается -
PreventLoggedInAccess.canActivate -
AuthGuardService.canActivateChild
-
- Вторая попытка -
app/home→app/contents:-
navigate(['app/contents'])вызывается -
AuthGuardService.canActivateChild
-
Конечно, ожидаемое поведение - второе.
РЕДАКТИРОВАТЬ
Удаление this._router.navigate([/app/home]); из PreventLoggedInAccess.canActivate решает проблему
canActivate(): boolean {
if (!this._authService.isAuthenticated()) {
return true;
}
return false;
}
Но все же я не понимаю, почему PreventLoggedInAccess.canActivate вызывается при навигации по дочернему app хотя к AuthGuardService.canActivateChild прикреплен AuthGuardService.canActivateChild? Почему он называется только с первой попытки?