2016-11-21 18 views
1

私は自分のルートのいずれかに認証ガードを実装しようとしていますが、観測可能な方法ではそれを行う方法がわからないので動作できません。アングル2 authガードを観測可能にする方法

私はトークンを保存するために ngrx/storeを使用して、ガードに私は(あなたがログインしている場合)、このようになりますオブジェクトフェッチ this.store.select('auth')、使用してそれをフェッチ

{ 
    token: 'atokenstring', 
    isAuthenticated: true, 
    isPending: false 
} 

とガードルックスを

export class AuthGuardService implements CanActivate { 

    constructor(private router: Router, private store: Store<IStore>) {} 

    canActivate(): Observable<any> { 

    return this.store.select('auth').let((state: Observable<IAuthStorage>) => state.filter((auth: IAuthStorage) => !auth.isPending && auth.isAuthenticated)).map(
     (auth: IAuthStorage) => { 

     if (!auth.isAuthenticated) { 
      return this.router.navigateByUrl('admin/login'); 
     } 
     else { 
      return true; 
     } 
     } 
    ); 
    } 
} 

ここで問題は、ガードがブール値ではなく観測値を返すということです。 trueを返すelseの中に入っても、ルートがレンダリングされない原因になります。

ガードが観測可能ではなくブール値を返すようにするにはどうすればよいですか?

答えて

1

ないこれはまだケースですが、しばらく前にこのような何かが唯一完了するために、一つのイベントのために、ではない、観察そのものを待つためにルータの

canActivate(): Observable<any> { 

    return this.store.select('auth').let((state: Observable<IAuthStorage>) => state.filter((auth: IAuthStorage) => !auth.isPending && auth.isAuthenticated)).map(
     (auth: IAuthStorage) => { 

     if (!auth.isAuthenticated) { 
      return this.router.navigateByUrl('admin/login'); 
     } 
     else { 
      return true; 
     } 
     } 
    ).first(); // <<<=== added 
    } 

を必要とした場合を確認してください。

firstをインポートする必要があります。

+0

ニースは、インポートする必要なくテイクを使用することができますが表示されます。ありがとう。 – Chrillewoodz

+0

おそらく、それをカバーする別のインポートがあります。一度にすべてをインポートすることも、使用するものだけをインポートすることもできます。それを聞いてうれしいことがあなたの問題を解決します。 –

+0

私はrxjsライブラリから 'Observable'をインポートします。そのインポートに自動的に含まれているかどうかはわかりません。実際に働いている間は気にしないでください:P – Chrillewoodz

関連する問題