我在角度4项目中使用NGRX平台。我正在使用RXJS +5。
在初始化组件时,我从我的商店中选择一个对象数组。我希望每次数据在我的商店中发生变化时,这个observable都会发出一个数组。
我正在解压缩数组,但是将可观察数据流打包回一个发出一次的数组就会给我带来麻烦。
我想执行以下操作,但这永远不会发出值,因为订阅永远不会完成。据我所知,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的每一次迭代中发出一个新数组。我希望这个observable发出一个包含其中所有值的数组。
我怎样才能做到这一点?
答案 0 :(得分:0)
这个解决方案并不适合我,但它确实完成了我想要的。我愿意听取不同的方法。
this.addedProducts$ = this._store.select(s=>s.order.selectedProducts)
.map(prods=>{return prods.map((prod)=>prod._id)});
答案 1 :(得分:0)
我认为值与时间和当前值之间存在误解。
请让我知道,但我认为这个解决方案已经足够了:
this.addedProducts$ = this
._store
.select(s=>s.order.selectedProducts)
.map(prods =>
prods.map(prod => prod._id)
);
第一个map
是Observable
中的一个,第二个只是您可以在任何数组上使用的javascript map
。
所以最后,每次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);