У меня проблема с навигацией по различным маршрутам.
У меня есть два разных модуля маршрута.
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
? Почему он называется только с первой попытки?