2017-05-16 12 views
-1

私は角度のアプリケーションで観測可能な値を使用しています、そして、私は他の動作の主題から派生したいくつかの動作の主題を作りたいと思います。私は.map()演算子で私の動作の主題を変換していましたが、.valueを参照できないことがわかりました。私は最後に放出されたように現在の値を参照できるようにしたかったので(マッピング関数を通って渡されました) )foo.map(の出力と周り掘り少し私は私が私が望んでいた機能を得ることができた:RxJS他の行動科目からの行動科目を作成する適切な方法?

let foo = /* some BehaviourSubject */ 
let bar = foo.map((x) => x/2) 
bar.operator.project(bar.destination.value) // to get the value as last emitted 

をしかし、現在、私のように見える何かをやっている

を見て非常に良いではないthatsのこれは私が欲しい機能を得るために:

foo = /* some observable*/ 
bar = foo.map((x) => x/2).toBehaviorSubject() 
foobar = bar.map((y) => y > 10).toBehaviorSubject() 

toBehaviorSubjectは()私は、次の

rx.Observable.prototype.toBehaviorSubject = function (initialValue) { 
initialValue = initialValue || null 
let subject$ = new rx.BehaviorSubject(initialValue) 
this.subscribe((value) => { subject$.next(value) }) 
return subject$ 
} 
として定義した関数であります0

私が先に解決策として、これをおもちゃにしていたが、私は上に示したものを選びました:

foo = /* some BehaviourSubject */ 
bar = new rx.BehaviorSubject(foo.value/2)) 
foo.subscribe((x) => { 
    bar.next(x/2) 
}) 
foobar = new rx.BehaviorSubject(bar.value > 10) 
bar.subscribe((y) => { 
    foobar.next(y > 10) 
}) 

これらの仕事とすべてを、私は聞いている、働く何かのための標準的な慣習があります上記の2つの例のように?

編集-------------------

いくつかの追加のコンテキストが役に立つかもしれません。

私はBehaviorSubjectをlocalStorage.get(key)機能のBehaviorSubjectsに渡すwindow.localstorageアクセス用に書いたサービスから提供されているBehaviorSubjectを持っています(auth.User$)。私はこのラッパーを書いて、値を変更したタブ以外のすべてのタブでlocalStorage変更イベントが発生するという事実に対処しました。

私のアプリケーションの中には、ユーザーが初期化されているかどうか、またはユーザーが匿名ユーザー(ログインしていないポートレットにアクセスできるものもあれば、認証されたもの) )、これらのステータスが変化したとき。 isInitialized、isAnonymous、isAuthenticatedのブール値を生成するロジックが重複するのを避けるため、より多くのBehaviorSubjectsをauth.User$から派生させたいと考えました。アプリケーションの一部の部分ではオンコールの値が必要なだけなので、特にBehaviorSubjectsにする必要があります。そのため、参照可能にすることは、そのオブザーバブルを購読するよりも好ましいです。

auth.user$が発生したときに発生する観測可能な値を持っていて、放出された値を変換するが、上記のようにBehaviorSubjectにしたいと思っていたので、関数を使用しました。

私の質問は本質的です:BehaviorSubjectに変換/マッピング関数を適用し、BehaviorSubjectを取得するための標準的な規則がありますか?

+0

これで解決しようとしている実際の問題は何ですか?なぜ、第二の主題に値をプッシュしたいのですか?あなたは代わりに2つのソースを組み合わせることができますか? – jonrsharpe

+0

私はそれを使ってタブ間のユーザー認証を処理しています。元のオブザーバブルは '$ window.localStorage'変数の次の値を取得する動作対象です。認証サービスでは、ユーザの初期化された、匿名の、認証されたステータスのための動作のサブジェクトを作成し、ログインとログアウトを処理したいいくつかのポートレットはログインする必要なしに見ることができ、場合によってはサブスクライブされ、他の場所では 'auth.isAnonymous.value'(など)で参照されます。 –

+1

質問に文脈を追加するために[編集]できますか?間違った問題を解決しようとしているかもしれないと思います。 – jonrsharpe

答えて

0

私はあなたの質問を理解することはできませんが、基本的には動作の主題には常に値があるので、いつでもその値から主題を照会することができます。私はRxjs v5を信じて、getValueが関連する方法です。

let foo = /* some BehaviourSubject */ let bar = foo.map((x) => x/2)を実行すると、barはもはや対象ではありません。これは、観測可能な値のストリームの生成元です。プロデューサーを開始して実際に価値を得るには、barに登録する必要があります。あなたのAPIはちょうどそれをするようです。より短い方法はbar.subscribe(anotherBehaviourSubject)です。

今、プロデューサーを早く始める必要がありますか?つまり、最初に行動主題が実際に必要ですか?そうしたら、もちろん進んでいく。

関連する問題