仅订阅多个FormControl(S)一次



我已经根据某种逻辑从一个大型组中过滤了几个FormControl(S( - 我想知道如何合并/组合那些选择的formControls,并且只有一个订阅..

我研究了RXJS文档和大理石图,但不正确理解。理解所有这些并知道用于我的案件是非常困惑的:

- forkJoin
- combineLatest
- merge
- join
- zip

以下是有关问题的更详细信息:

假设2 formcontrols(即控制器,控制b(。我想在任何formcontrol值更改时执行我的一些handlerFunction。*每当有任何控件的Valuechange(在我的情况下,任何一个控件都会一次更改(

时,它需要执行一次我的处理程序功能

谢谢。

最佳选择是combineLatest,它在所有源源发射至少一个值之后发出,然后在任何源中的每次发射中都从任何可观察到的源:

Observable.combineLatest(controlA.valueChanges, controlB.valueChanges)
  .subscribe(...);

最终您可以用startWith(null)链接每个源,以确保每个源将立即发射一项并过滤您在订户中所需的内容。

Observable.combineLatest(
    controlA.valueChanges.startWith(null),
    controlB.valueChanges.startWith(null)
  )
  .subscribe(([val1, val2]) => ...);

btw,关于其他操作员:

  • zip-仅当所有来源发出相同数量的项目
  • 时发出
  • forkJoin-当所有源排放至少一项并完成时发出(valueChanges永远不会发生(
  • merge-仅合并可观察到的东西,但您不知道哪一个发出了什么值
  • join-我不认为这是RXJS 5

对于那些不弃用的人组合的人,请尝试将ValueChanges观测值组合在数组中。另外,对于那些不推荐使用的人,请尝试不使用null。

combineLatest([
    this.typeSelected.valueChanges.pipe(startWith('')),
    this.checkedFC.valueChanges.pipe(startWith(false))
  ]
).subscribe(([type, checked]) => {
   console.log([type, checked]);
});

最新更新