I'm having an issue trying to navigate through different routes.
I have two different route modules.
app.routes.ts:
Containing only 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 });
With PreventLoggedInAccess.canActivate, that, if the user is already logged in redirects him to the logged in section with /app prefix and child route home. It's defined as:
canActivate(): boolean {
if (!this._authService.isAuthenticated()) {
return true;
}
this._router.navigate(['/app/home']);
return false;
}
pages.routes.ts:
Containing all /app subroutes that are accessible only if the user is logged in. This is achieved using 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);
With the latter that redirects to /login if the user isn't logged in. It's defined as:
canActivateChild(): boolean {
if (this._authService.isAuthenticated()) {
return true;
}
this._router.navigate(['login']);
return false;
}
When I navigate from
app/hometoapp/contentsit only goes toContentsComponentafter navigating two times. So, if I do two timesthis._router.navigate(['app/components']);it works, if I do it only one time, the route changes fromapp/hometoapp/routefor 1ms and it returns toapp/home, while if I do it a second time it changes route. While, if I'm inapp/contentsand try to navigate toapp/homeit changes route just fine.
isAuthenticated works fine. Both authguards work just fine, so, if I try to access any app child route when I'm not logged In I get redirected to login and If I try to access login when I'm logged In I get redirected to app/home.
I managed to debug a bit and I noticed the following flow:
- First attempt -
app/home->app/contents:navigate(['app/contents'])is calledPreventLoggedInAccess.canActivateis calledAuthGuardService.canActivateChildis called
- Second attempt -
app/home->app/contents:navigate(['app/contents'])is calledAuthGuardService.canActivateChildis called
Of course the expected behavior is the second one.
EDIT
Removing this._router.navigate([/app/home]); from PreventLoggedInAccess.canActivate solves the issue
canActivate(): boolean {
if (!this._authService.isAuthenticated()) {
return true;
}
return false;
}
But still, I do not understand why PreventLoggedInAccess.canActivate is called when navigating to an app child even though AuthGuardService.canActivateChild is attached to it? Why is it called only on the first attempt?