我有一个类型为Observable<Workcenter[]>
的可观察到的名为“ workcentersFiltered”
选择工厂后,可以使用以下代码成功过滤我的工作中心-没问题:
this.workcentersFiltered = this.newLineForm.get('plant').valueChanges
.flatMap(selectedPlant => {
return this.dataStore.Workcenters.map(workcenters => {
return workcenters.filter(x => x.PlantNumber === selectedPlant.PlantNumber);
});
});
问题是,当一个完全不同的,独立的可观察到的“
'workcenter'.valuechanges
”发出一个字符串时,我想进一步缩小该数组的范围(这是一个输入字段,我正在尝试实现自动完成)。因此,问题是,我如何订阅
this.newLineForm.get('workcenter').valueChanges
,以便它发出的字符串值可用于进一步缩小workcentersFiltered
(已与this.newLineForm.get('plant').valueChanges
绑定在一起)内“隐藏”的数据。我的困境有意义吗?我必须改为将
workcenteresFiltered
重做为aBehaviorSubject,还是这里的正确解决方案是什么?编辑更多说明
当前,由于选择了工厂,当
plant-forminput.valuechanges
发出更改时,workcentersFiltered从dataStore.Workcenters获取数据。因此,我可以将所有工作中心缩小到仅与所选工厂匹配的工作中心。我上面的代码可以正常工作。但是,我想对plant-forminput.valuechanges和workcentersFiltered之间的序列进行新的操作。我想根据workcenter-forminput.valuechanges的发射结果进一步缩小选择范围。
因此,在我的UI上的第1步中,用户可以从下拉列表中选择一个工厂,并且其他工厂的所有工作中心都将被过滤掉-这是可行的。
然后,步骤2供用户选择特定的工作中心。这是一个文本输入字段。我希望在这里键入的每个字母(在workcenter-forminput.valuechanges上发出),以进一步缩小选项的范围(用于自动完成)。
我很难想象解决方案,因为从步骤2开始新引入的observable(workcenter-forminput.valuechanges)仅在发出时才有意义。
最佳答案
您可以为此使用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)));