获取到观察数据
我采用了棱角分明,NGRX /存储的即时访问和rxjs获取到观察数据
所以我有一个车减速和项目减速。
当我从API中提取项目时,我需要知道它们是否已经在购物车中。
所以,因为我已经实现了分页,我认为最好的方式是检查在实际的服务中获取Items并在Items对象内创建一个InCart字段。
我不想在订阅中这样做,因为当我提取项目时,我不会更改购物车状态,因此订阅将永远不会被调用。如果我使用地图 ,我也无法访问服务中的数据。
所以我真的不知道如何以'最佳实践方式'来做到这一点。
也许我也可以以旧的方式将购物车对象保存在购物车服务中,但我认为这不是最好的做法。
下面的这段代码对我来说是理想的情况。 (但是这OFC不工作,因为我无法访问使用拔毛或地图车对象。)
getItems(): Observable<Item[]> {
return this.http.get(url)
.map(this.extractData)
.map(this.extractItemlist)
.catch(this.handleError)
}
private extractItemlist(res: ApiResponse) {
switch (res.response.type) {
case ApiResponse.TYPE.ERROR:
throw res.response.data.message
case ApiResponse.TYPE.SUCCESS:
this.checkIfItemsAreInCart(res.response.data.list)
return res.response.data.list
}
}
private checkIfItemsAreInCart(items: Item[]) {
const cart = this.store.select<CartState>('cart').pluck('cart')
for (const item of items) {
for (const cartItem of cart.items) {
if (item.details.item_id === +cartItem.item_id) {
item.inCart = true
} else {
item.inCart = false
}
}
}
}
有没有人对如何实现这一想法?我对这个可观察的东西很陌生,所以可能这就是为什么我仍然没有想出一个好的解决方案。
我真的很感谢一些帮助。
我并不想这样做的订阅,因为当我取回物品我不会改变的车状态,这样的认购将永远不会被称为
订阅可观察到的将被称为你第一次打电话所以它不需要“改变”。
private checkIfItemsAreInCart(items: Item[]) {
this.store.select<CartState>('cart')
.take(1)
.subscribe(cart => {
for (const item of items) {
for (const cartItem of cart.items) {
if (item.details.item_id === +cartItem.item_id) {
item.inCart = true
} else {
item.inCart = false
}
}
}
});
}
@Frederico耶稣:如果它符合你的要求,请标记它是正确的答案,tks。 –
你也可以使用'.take(1)'而不是退订第一项 – Nataly87
@ Nataly87之后你是对的,我会更新答案,tks –
最佳做法是不使用'pluck'而不将字符串传递给'select';看到[这个答案](https://*.com/a/44510829/6680611)。而且,关于同步访问商店,请参阅[本答案](http://*.com/a/42706832/6680611)。 – cartant