2016-08-10 5 views
3

CanActivate classは返品の種類がObservable<boolean>です。私には意味をなさないAngular 2のCanActivateがPromiseの代わりにObservable <boolean>を返すのはなぜですか?

のみ使用事例は以下のとおりです。

  1. CanActivateは「非同期」observer.next(true|false)が呼び出されるまで表示されているルートをブロックすることができます。
  2. CanActivateが許可するルートを表示してからobserver.next(false)を私のアプリケーションの別の部分からプッシュし、そのルートを消すことができます。

ただし、ポイント1は動作しますがポイント2は動作しません。したがって、CanActivateが便宜以外の返品タイプObservable<boolean>を許可する理由が見つからないため、APIが複雑になります。 CanActivateは返品のタイプがbooleanPromiseの場合にのみクリーナーになります。

Angular、RxJS、およびすべてのノードに基づいていますので、わかりやすさが不足している可能性があります。 Observer<boolean>の戻り値の型が意味する、CanActivateから機能を抽出しようとしばらく時間を費やしました。

+0

「約束」を使用せず、Observablesで置き換えることを決定しました。完了する前にただ一つの値を返すObservableを持つことができます。すべてのhttp呼び出しは現在インスタンスのために約束されています。 –

+0

v3ルータのベースとなったルータを構築した開発者に質問してみませんか? [問題を作成する](https://github.com/ngrx/router/issues)、質問をすると、回答が得られる可能性があります。 – cartant

+0

OKです。それが愚かな質問だったかどうかは分かりませんでした。 – Dan

答えて

0

AngularJS 2では、ほぼすべての非同期操作がObservableを返します。独自のCanActivateを実装できるため、サーバーアクセスで行うことができます。たとえば、サーバーの管理者資格情報を確認します。同様の例hereが表示されます。

このメソッドがboolean型のデータ型を返した場合は、ページをブロックする必要があります。

0

これにより、非同期処理を実行できます。認証サービスから観測可能なcurrentUserがあるとします。それはReplaySubscriber(1);であり、常に現在のログインユーザを返しますが、アプリが最初に読み込まれたときにauthコールが処理中である可能性があるので、完了したかどうかわかりません。

CanActivate() { 
    return this.currentUser.map(user => user && user.isActive()); 
} 
+0

「Observable」を使用することは、私が[複数値](http://reactivex.io/rxjs/manual/overview.html#observable)を押すために設計されているので、私の質問のポイント2で説明したように、 。 'CanActivate'は、観測値からunsubscribesする前に* one値をプッシュする能力しか持っていません。したがって、確かに 'Promise'戻り型がより適切です。私はより明確に質問を更新します。 – Dan

+0

CanActivateはアクティブ化の前にのみチェックされていると思います。私は、経路が活性化された後、観測可能なものを聞き続けているとは思わない。 –

+0

これは私が見る機能だから、プロミスを返す方が適切だと思うのはそのためだ。 – Dan

関連する問題