2016-12-02 94 views
0

加载应用程序之前,我想检查用户是否登录并加载一些数据。因此,我把两名警卫放在最高的路线上,但他们没有被执行。难道不可能把canActivate放在顶层路线上吗?在哪里放置警卫是否有任何限制?路由器:CanActivate在顶级路线

路由配置

export const routes = [ 
    { 
     path: '', 
     canActivate: [IsAuthenticatedGuard, IsDataLoadedGuard], 
     children: [ 
      { 
       path: '', 
       redirectTo: '/something', 
       pathMatch: 'full' 
      } 
     ] 
    } 
]; 

/东西是不同的模块的一部分,该路径被使用RouterModule.forChild()

卫兵另一模块中装载

@Injectable() 
export class IsAuthenticatedGuard implements CanActivate { 

    constructor(private _router: Router) {} 

    canActivate(
     route: ActivatedRouteSnapshot, 
     state: RouterStateSnapshot 
    ): Observable<boolean> { 
     if (!this._isSignedIn()) { 
      window.location.replace('/signin.html'); 
      return Observable.of(false); 
     } 
     return Observable.of(true); 
    } 

    _isSignedIn(): boolean { 
     return document.cookie.indexOf('jwt_cookie') !== -1; 
    } 
} 


@Injectable() 
export class IsDataLoadedGuard implements CanActivate { 

    private homeState$: Observable<IHomeState>; 

    constructor(private _router: Router, private _store: Store<IAppState>) { 
     this.homeState$ = _store.select('home'); 
    } 

    canActivate(
     route: ActivatedRouteSnapshot, 
     state: RouterStateSnapshot 
    ): Observable<boolean> { 
     return this.homeState$.map((homeState: IHomeState) => 
      !homeState.get('loading') || homeState.hasIn(['home', 'id']) 
     ); 
    } 
} 

应用程序doe s被重定向到/something,当它实际上应该重定向到/signin.html。我究竟做错了什么?

回答

0

您需要在父路线上使用canActivateChild。请参阅文档here。如果你想要一个受保护的子路线很有用。你可以使用你的同类IsAuthenticatedGuard。

+0

我试过了,但是这也不起作用,我会再试一次并报告观察到的行为。 – KenavR