2016-12-02 4 views
0

Перед загрузкой приложения я хочу проверить, подписан ли пользователь и загрузить некоторые данные. Поэтому я помещаю двух охранников на верхний маршрут, но они не выполняются. Невозможно ли поместить canActivate на маршрут верхнего уровня? Существуют ли какие-либо ограничения в отношении того, где поставить охранников?Маршрутизатор: CanActivate на верхнем уровне маршрута

Route Config

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

Смежные вопросы