Hello i faced with a problem. My CanActivate guard is called twice, when i trying navigate to page that is not permited because i'm not logged in.
I have 1 root module, and provided there my CanActivate guard and other services.
Thank you in advance!
Here is my router:
const appRoutes: Routes = [
{
path: "",
pathMatch: "full",
redirectTo: "/meal-list",
},
{
path: "login",
component: LoginComponent,
},
{
path: "meal-list",
component: MealListComponent,
canActivate: [AuthActivateGuard],
}
];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes, {useHash: true});
and guard:
@Injectable()
export class AuthActivateGuard implements CanActivate {
constructor(private authService: AuthService,
private router: Router) {
console.log("guard created");
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>|boolean {
if (!this.authService.authenticated) {
return this.authService.checkLogged().map(res => {
this.authService.authenticated = true;
return true;
}).catch(()=> {
this.authService.authenticated = false;
this.router.navigate(["login"]);
return Observable.of(false);
});
}
return true;
}
}
I noticed it will not work with Hash: Below is my example, and notice: the code below will call penModalDialogInvalid() twice as I use
@Injectable() export class UserDetailsGuard implements CanActivate {
}
If I comment out the navigation line above, it will call the function once!!!! otherwise twice except in Firefox and all Firefox-based browsers!!!! why???? I dunno!!!!!
Although this is not a solution, it is an answer:
This happens when using hash routing (useHash: true).
It may be a bug in the Angular router.
I am still investigating to see if there is a solution.
Steve
Please reomove slash before the route link.