2016-12-02 7 views
0

アプリをロードする前に、ユーザーがログインしていてデータが読み込まれているかどうかを確認したいと思います。したがって、私は2人のガードを最上のルートに置くが、実行されない。トップレベルのルートに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']) 
     ); 
    } 
} 

app doe実際に/signin.htmlにリダイレクトする必要がある場合は、/somethingにリダイレクトされます。私は間違って何をしていますか?

答えて

0

親ルートでcanActivateChildが必要です。ドキュメントhereを参照してください。保護されたサブルートが必要な場合に便利です。同じクラスのIsAuthenticatedGuardを使用することができます。

+0

私は試しましたが、これもうまくいきませんでした。私はもう一度試して、観察された挙動を報告します。 – KenavR

関連する問題