Javascript RxJs:由2个独立的可观测值触发可观测值

Javascript RxJs:由2个独立的可观测值触发可观测值,javascript,angular,rxjs,reactive-programming,rxjs5,Javascript,Angular,Rxjs,Reactive Programming,Rxjs5,我有一个名为“workcentersFiltered”的可观察对象,类型为observable 选择工厂时,我可以使用以下代码成功筛选我的工作中心-没问题: this.workcentersFiltered=this.newLineForm.get('plant')。值更改 .flatMap(selectedPlant=>{ 返回此.dataStore.Workcenters.map(Workcenters=>{ 返回workcenters.filter(x=>x.PlantNumber===s

我有一个名为“workcentersFiltered”的可观察对象,类型为
observable

选择工厂时,我可以使用以下代码成功筛选我的工作中心-没问题:

this.workcentersFiltered=this.newLineForm.get('plant')。值更改
.flatMap(selectedPlant=>{
返回此.dataStore.Workcenters.map(Workcenters=>{
返回workcenters.filter(x=>x.PlantNumber===selectedPlant.PlantNumber);
});
});
问题是,当一个完全不同的、独立的可观察的“
'workcenter.valuechanges
”发出一个字符串(这是一个输入字段,我正在尝试实现自动完成)时,我想进一步缩小该数组的范围

所以问题是,我如何订阅
this.newLineForm.get('workcenter').valueChanges
,以便它发出的字符串值可以用来进一步缩小
workcentersFiltered
(它已经绑定到
this.newLineForm.get('plant').valueChanges
)中“隐藏”的数据

我的困境有意义吗?我必须重新将
workcentresfiltered
作为行为主体,还是这里的正确解决方案是什么

编辑更多解释

当前Workcenters Filtered从数据存储中获取数据。Workcenters在
plant forminput.valuechanges
发出更改时,因为选择了一个工厂。因此,我可以将所有工作中心缩小为仅与所选工厂匹配的工作中心。它与我上面的代码配合得很好

但是,我想在plant-forminput.valuechanges和workcentersFiltered之间的顺序上引入一个新的操作。我想根据workcenter-forminput.valuechanges的排放量进一步缩小选项范围

因此,在我的用户界面上的第一步,用户可以从下拉列表中选择一个工厂,其他工厂的所有工作中心都会被过滤掉——这很有效

然后,第2步是让用户选择一个特定的工作中心。这是一个文本输入字段。我希望在这里键入每个字母(在工作中心forminput.valuechanges上发出),以进一步缩小选项范围(用于自动完成)

我很难想象这个解决方案,因为步骤2(workcenter forminput.valuechanges)中新引入的observable只有在发出时才相关。

您可以使用它

我无法理解您的完整描述,因此我将只提供一个大概的示例,希望您能够根据您的特定用例进行调整:

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)));

对不起,我不明白你的问题。你能试着解释多一点或不同一点吗?和/或制作一个小的大理石图来显示你的期望吗?对不起,我不知道如何制作大理石图。我编辑了我的帖子,试图用不同的方式来解释它。我意识到将filteredWorkcenters作为观察者是毫无意义的能够。一旦我从可观察的数据存储中检索到数据,我会将filteredWorkcenters存储为一个普通数组-也不可观察。然后我可以更轻松地使用它。太棒了。CombineTest的大量使用非常有意义。我现在意识到我正在尝试实现不可能的目标,而不引入一个新的专用于workcent的变量住所