2017-10-18 95 views
1
觀察到觸發

我有一個觀察的名爲「workcentersFiltered」式的Observable<Workcenter[]>RxJs:到2個獨立的觀測

當我選擇一個廠,我可以成功過濾了我用下面的代碼工作中心 - 沒問題:

this.workcentersFiltered = this.newLineForm.get('plant').valueChanges 
     .flatMap(selectedPlant => { 
     return this.dataStore.Workcenters.map(workcenters => { 
      return workcenters.filter(x => x.PlantNumber === selectedPlant.PlantNumber); 
     }); 
     }); 

的問題是,我想縮小這一陣列向下furtherly,當一個完全不同的,獨立的可觀察到的「'workcenter'.valuechanges」發出一個字符串(它是一個輸入字段 - 我試圖執行自動完成)。

所以,問題是,我怎麼可以訂閱this.newLineForm.get('workcenter').valueChanges,所以它發出的字符串值可以用來furtherly內workcentersFiltered縮小數據「隱藏」(這已經是拴this.newLineForm.get('plant').valueChanges

難道我的困境有意義嗎?我必須重做,而不是作爲workcenteresFiltered代替aBehaviorSubject,或者這裏什麼是正確的解決辦法嗎?

編輯在更多的解釋

當前工作中心篩選從dataStore.Workcenters獲取數據,當plant-forminput.valuechanges發出更改時,因爲選擇了工廠。因此,我可以將所有工作中心縮小到只有與所選工廠匹配的工作中心。它適用於我上面的代碼。

但是我想介紹一下plant-forminput.valuechanges和workcentersFiltered之間的順序的新操作。我想根據workcenter-forminput.valuechanges的排放情況進一步縮小選項範圍。

因此,第一步在我的用戶界面上,用戶可以從下拉列表中選擇一個工廠,並將其他工廠的所有工作中心都過濾掉 - 這是有效的。

然後,第2步是讓用戶選擇一個特定的工作中心。這是一個文本輸入字段。我想要在這裏輸入每個字母(在workcenter-forminput.valuechanges上發出),以進一步縮小選項範圍(用於自動完成)。

我很難想象解決方案,因爲從步驟2(workcenter-forminput.valuechanges)中新引入的observable僅在發射時才相關。

+0

很抱歉,但我不明白你的問題。你可以嘗試多解釋一下還是不一樣?和/或製作一個小的大理石圖表來展示你的期望? – Maxime

+0

對不起,我不知道如何製作大理石圖。我編輯我的帖子,嘗試以不同的方式解釋它。 – Amivit

+0

我意識到,將filteredWorkcenters作爲可觀察對象確實沒有意義。一旦我從數據存儲可觀察數據中檢索數據,我就會將filteredWorkcenters存儲爲普通數組 - 不可觀察。然後我可以更輕鬆地使用它。 – Amivit

回答

3

您可以使用combineLatest

我不能按照你的完整描述,所以我就提出了一個近似的例子,你可以希望適應您的具體使用情況:

workcentersForPlant = this.newLineForm.get('plant').valueChanges 
     .flatMap(selectedPlant => { 
     return this.dataStore.Workcenters.map(workcenters => { 
      return workcenters.filter(x => x.PlantNumber === selectedPlant.PlantNumber); 
     }); 
     }); 

const workCenterNameChanges = this.newLineForm.get('workCenterName').valueChanges; 

// combine the 2 observables, this will trigger when either observable 
// changes. Use the combined values to do the filtering by name 
this.workcentersFiltered = Observable 
    .combineLatest(workcentersForPlant, workCenterNameChanges$) 
    .map(([workCenters, workCenterName]) => workCenters.filter(w => w.name.startsWith(workCenterName))); 
+0

太棒了。 combineLatest大有用處 - 它非常有意義。我意識到現在我正在努力實現不可能的目標,而不是引入一個專門用於workcenterNameChanges的新變量 – Amivit