2017-06-16 90 views
2

我采用了棱角分明,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 
     } 
    } 
    } 
} 

有没有人对如何实现这一想法?我对这个可观察的东西很陌生,所以可能这就是为什么我仍然没有想出一个好的解决方案。

我真的很感谢一些帮助。

+0

最佳做法是不使用'pluck'而不将字符串传递给'select';看到[这个答案](https://stackoverflow.com/a/44510829/6680611)。而且,关于同步访问商店,请参阅[本答案](http://stackoverflow.com/a/42706832/6680611)。 – cartant

回答

1

我并不想这样做的订阅,因为当我取回物品我不会改变的车状态,这样的认购将永远不会被称为

订阅可观察到的将被称为你第一次打电话所以它不需要“改变”。

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 
      } 
     } 
     } 
    }); 
} 
+0

@Frederico耶稣:如果它符合你的要求,请标记它是正确的答案,tks。 –

+1

你也可以使用'.take(1)'而不是退订第一项 – Nataly87

+0

@ Nataly87之后你是对的,我会更新答案,tks –