您好我遇到了问题。 当我尝试导航到因为我没有登录而没有被允许的页面时,我的CanActivate警卫会被调用两次。
我有1个根模块,并提供了我的CanActivate后卫和其他服务。
提前谢谢!
这是我的路由器:
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});
和警卫:
@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;
}
}
答案 0 :(得分:2)
虽然这不是一个解决方案,但它是一个答案:
使用散列路由时会发生这种情况(useHash:true)。
这可能是Angular路由器中的错误。
我仍在调查是否有解决方案。
史蒂夫
答案 1 :(得分:1)
我注意到它不适用于Hash: 下面是我的例子,请注意:下面的代码将调用penModalDialogInvalid() 我用了两次
providers: [{provide:LocationStrategy,useClass:HashLocationStrategy}],
@Injectable()
export class UserDetailsGuard implements CanActivate {
constructor(private _router:Router,
private winRef: WindowRef){}
canActivate(route:ActivatedRouteSnapshot,state: RouterStateSnapshot ) : boolean {
let id=+route.url[0].path;
if (isNaN(id) || id <1 ){
this.winRef.nativeWindow.openModalDialogInvalid();
//this._router.navigate(['/pagenotfound']);
return false;
}
return true;
}
}
如果我注释掉上面的导航线,它会调用该功能一次!!!!否则两次,除了在Firefox和所有基于Firefox的浏览器!!!!为什么????我不知道!!!!!
答案 2 :(得分:0)
请在路线链接前重新删除斜杠。
redirectTo: "meal-list"