2017-08-23 19 views
0

私はAngler 4プロジェクトでNGRXプラットフォームを使用しています。私はRXJS +5を使用しています。オブザーバブルストリームから1つの配列を出力するにはどうすればよいですか?

コンポーネントの初期化時に、私は自分のストアからオブジェクトの配列を選択しています。私は、この観測可能なデータを私の店のデータが変更されるたびに1つの配列で出力したいと思っています。

私は配列をうまく解凍していますが、観測可能なストリームを一度に1つの配列にパッケージ化してしまうと、問題が発生します。

私は以下のことをしたいと思いますが、サブスクリプションが決して完了しないため、これは決して値を出しません。私の知る限り、toArrayは完了時にのみ発光します。

this.addedProducts$ = this._store.select(s=>s.order.selectedProducts) 
     .flatMap(prods=>prods) //emits an observable for each product in store 
     .map(prod=>prod._id) //returns the id for each product 
     .toArray(); // I would like this to be an Observable<string[]> 

代わりに、私はこのような何かを行っている:

this.addedProducts$ = this._store.select(s=>s.order.selectedProducts) 
    .flatMap(prods=>prods) 
    .map(prod=>prod._id) 
    .scan((acc, value) => { 
    acc.push(value); 
    return acc; 
    }, []) 

しかし、これは新しい配列に配列に_idを追加するごとに1回の反復を発します。私はこれを観察して、その中のすべての値を持つ単一の配列を出力したいと思います。

どうすればこの問題を解決できますか?

答えて

0

この解決法は私にはうまくいきませんが、私が探していたものを達成します。私はさまざまなアプローチを聞いて開いています。

this.addedProducts$ = this._store.select(s=>s.order.selectedProducts) 
    .map(prods=>{return prods.map((prod)=>prod._id)}); 
+1

なぜあなたはそれを好きではありませんか?あなたは単に 'map(prods => prods.map(p => p.id))'と言うことができます – Skeptor

0

私は時間の経過とともに値と現在の値との間に誤解があると思います。

私に知らせて、私はこのソリューションは十分にあるとお考えください。

this.addedProducts$ = this 
    ._store 
    .select(s=>s.order.selectedProducts) 
    .map(prods => 
    prods.map(prod => prod._id) 
); 

最初mapは、第1には、ちょうどあなたが任意の配列で使用することができますjavascriptのmapで、Observableから1です。

最後に、s.order.selectedProductsが変更されるたびに、それらの製品のすべてのIDを含む新しい配列が取得されます。


言った、あなたの代わりにどこでもあなたのアプリであることで行うのでセレクタを使用することがあります:

// in some selector file, for example `products.selectors.ts` 
const getSelectedProductsIds => state => state.order.selectedProducts.map(prod => prod._id); 

// in every component, effect, whatever where you need to access the selected products IDs 
this.addedProducts$ = this._store.select(getSelectedProductsIds); 
関連する問題