Angular 2 CanActivate被调用两次

时间:2016-10-31 18:18:34

标签: angular angular2-routing

您好我遇到了问题。 当我尝试导航到因为我没有登录而没有被允许的页面时,我的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;
  }
}

3 个答案:

答案 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"