我有一个类型为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)));

09-25 18:32