2016-10-10 33 views
3

我NGRX商店篩選結果由兩組數據:preferenceGroups持有選擇偏好值和stocks組:從一個NGRX店減速器使用可觀察到的數據與另一個

有很多的preferenceGroups,在一個兩種格式,一組布爾值或一個範圍:

"preferenceGroups": [ 
    { 
     "name": "Sectors", 
     "type": "toggles", 
     "preferences": [ 
      { 
       "label": "Sector 1", 
       "type": "boolean", 
       "value": true 
      }, 
      { 
       "label": "Sector 2", 
       "type": "boolean", 
       "value": true 
      } 
     ] 
    }, 
    { 
     "name": "Exchange", 
     "type": "toggles", 
     "preferences": [ 
      { 
       "label": "Exchange 1", 
       "type": "boolean", 
       "value": true 
      }, 
      { 
       "label": "Exchange 2", 
       "type": "boolean", 
       "value": true 
      } 
     ] 
    }, 
    { 
     "name": "Price", 
     "type": "price-range", 
     "preferences": { 
      "label": "Price", 
      "type": "currency", 
      "value": { 
       "minimum": 0, 
       "maximum": 999 
      } 
     } 
    }, 
    ... 
] 

我也有一堆股票,都具有相同的領域,他們一般是這樣的:

"stocks": [ 
    { 
     "state": { 
      "accepted": false, 
      "rejected": false 
     }, 
     "change": -5.36, 
     "changePercent": -0.13, 
     "dividend": 12.05, 
     "equitySummaryScore": 8, 
     "exchange": "Exchange 1", 
     "price": 97.10, 
     "sector": "Sector 1", 
     ... 
    }, 
    ... 
] 

我的過濾器的工作方式是針對每個preferenceGroup,我想要考慮任何具有與任何布爾過濾器設置爲true的值相匹配的股票,並且在範圍的情況下,該範圍內的任何值。

我可以用

this.stocks = this._store.select('stocks'); 
this.preferenceGroups = this._store.select('preferenceGroups'); 

什麼,我需要做的是通過使用this.preferenceGroups數據過濾this.stocks存儲過濾股票作爲可觀察得到所有從我的店裏NGRX股票和preferenceGroups作爲觀測量。

this.filteredStocks = [something I can't figure out]

例如,我列出的單隻股票將是一個比賽,因爲它有"exchange": "Exchange 1""sector": "Sector 1""price": "97.10"

回答

3

如果你有兩個觀測,一個與股票,其他與您的過濾器,你需要結合兩個流。你需要的是一系列的股票和你的喜好,知道你是否可以展示它們。 檢查下面的代碼:

let stocks$ = Rx.Observable.of(["stock1", "stock2", "stock3"]); 

let preferences$ = Rx.Observable.of(["preference", "preference2"]); 

let combined$ = Rx.Observable.combineLatest(
    stocks$, preferences$, (stocks, preferences) => { 
     // implement your filtering logic here and returned the filtered stocks 
     return stocks + " " + preferences 
    }); 


combined$.subscribe((val) => console.log(val)); 

使用combineLatest中,將兩個觀測。正在傳遞給combineLatest方法的函數將獲得股票$ observable的最新值,以及來自首選項$ observable的最後一個值。這些觀察結果來自你的商店。

在這個函數中,你可以像執行命令式那樣實現你的過濾邏輯。

每次將新股票添加到商店時,ngrx會將新值推入股票觀察值,並且將重新評估具有您的邏輯的函數。新的偏好也是如此。

如果您在模板中訂閱了您的合併$流,每次添加股票或首選項都會導致更新後的視圖。

+0

偉大的迴應@KwintenP,這正是我所期待的。 – autoboxer

+0

您提供的函數示例在哪裏存在?在像FilteredStockService這樣的新服務或其他計算商店可觀察服務中。 – GFoley83

+0

這是邏輯我要麼放在一個智能組件,要創建流,並將其傳遞給一個愚蠢的組件。或者我會,但它會在我喜歡稱爲沙箱的抽象層中(閱讀這裏的內容:http://blog.brecht.io/A-scalable-angular2-architecture/ – KwintenP

相關問題