2017-04-20 39 views
0

場景:Angular 2:使用.subscribe()時可避免雙重代碼?

  • 用戶是一個頁面上,選擇他想要在他的購物車項目
  • 項目是一旦用戶輸入他看到所有的購物車放入(全球)服務
  • 他項目(其被加載到經由服務組件)

問題:

  • 如果用戶重新加載購物車,所有物品都不見了

解決方案:

  • 所有項目均通過持久性存儲保存,將被稱爲只有當用戶重新載入網站

過程: 爲了獲取站點重新加載後的項目,我正在訂閱一個服務,該服務從持久性存儲中收集所有項目。 當用戶進入購物車時(通過重新加載或通過應用程序內的直接導航),用於設置項目的代碼幾乎相同,因爲只有在網站重新加載後纔會觸發訂閱。

示例代碼:

ngOnInit() { 
     // We need the double code here because: 
     // 1. The normal code is for normal navigation of the user (e.g. from the home component to the shopping cart). 
     // The shopping cart is already filled with items 
    this.shoppingCart = this.shoppingcartService.shoppingCart; 

     // 2. The user reloads the site (or returns later after having it closed) and the shopping cart is filled (in the background) 
     // from the persistance store and emitted to all listeners of the application. 
     this.shoppingcartEmitter = this.shoppingcartService.shoppingCartEmitter.subscribe(shoppingcart => { 
     this.shoppingCart = shoppingcart; 
    }); 
} 

這是一個簡化版本,但我們可以看到,我需要兩行相同的行爲。

問題:有沒有可能避免雙重代碼? 我的問題是,我需要使用shoppingcart中的項目,並且我將不得不編寫代碼來處理訂閱內部和外部的shoppingcart。

+1

,使其堅持在車中的選擇項目[本地存儲或會話存儲(HTTPS爲什麼不改變服務:// WWW .w3schools.com/HTML/html5_webstorage.asp)?當服務初始化時,它會檢查存儲並加載項目(如果有的話)。然後,在頁面刷新的情況下,這些項目不會丟失。 – Igor

+0

是會話存儲(在這種情況下)將解決我的問題。但是我想知道是否還有其他解決方案或最佳實踐可以在這裏添加 - 如果會話存儲不起作用。 – Saerdn

+0

我只是總是訂閱發射器。如果不需要訪問商店,則可以返回一個新的observable,該observable使用'Observable.of'直接在服務中返回結果。 – Igor

回答

0

你可以做的就是這兩樣東西融合在一起

this.shoppingcartEmitter = this.shoppingcartService.shoppingCartEmitter.subscribe(shoppingcart => { 
     this.shoppingCart = shoppingcart.concat(this.shoppingcartService.shoppingCart); 
}