1

ルートの 1 つに認証ガードを実装しようとしていますが、オブザーバブルでそれを行う方法がわからないため、機能させることができません。

私は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;
        }
      }
    );
  }
}

現在、問題は、ガードがブール値ではなくオブザーバブルを返すことです。elseこれにより、戻り値の中に入ってもルートがレンダリングされませんtrue

ガードがオブザーバブルではなくブール値を返すようにするにはどうすればよいですか?

4

1 に答える 1

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
  }

ルーターは、オブザーバブル自体が完了するのではなく、1 つのイベントのみを待機します。

first利用できるようにするには、インポートする必要があります。

于 2016-11-21T06:39:52.677 に答える