2017-06-16 96 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 –