Angular - 如何组合多个" valueChanges"可观察到一个

时间:2017-12-12 20:31:55

标签: angular rxjs observable

如何将以下订阅合并为一个?

    this.form.get("type").valueChanges.subscribe(() => {
        this.calcFinalTransports();
    })
    this.form.get("departure").valueChanges.subscribe(() => {
        this.calcFinalTransports();
    })
    this.form.get("destination").valueChanges.subscribe(() => {
        this.calcFinalTransports();
    })
    this.form.get("stations").valueChanges.subscribe(() => {
        this.calcFinalTransports();
    })

3 个答案:

答案 0 :(得分:5)

根据您期望的输出,您有一些选择。您可能想阅读这篇文章:

如果您只是想在任何值更改时使用merge

获得通知
import {merge} from "rxjs/observable/merge";

merge(
    this.form.get("type").valueChanges,
    this.form.get("departure").valueChanges,
    this.form.get("destination").valueChanges
    this.form.get("stations").valueChanges
).subscribe(() => this.calcFinalTransports());

答案 1 :(得分:1)

如果要使用单个数据可观察模式并将多个可观察值组合为一个可观察值,那么 combineLatest 可能会有用。

PesudoCode

userNameAndEmail$=this.userNameAndEmail().pipe(startsWith(null));
userAddressDetail$=this.userAddressDetails().pipe(startsWith(null));
userMiscDetails$=this.userMiscDtls();


completeUserData$=combineLatest([userNameAndEmail$,userAddressDetail$,userMiscDetails$])
.pipe(map(([userNameAndEmail,userAddressDetail,userMiscDetails])=>{  
 return {userNameAndEmail,userAddressDetail,userMiscDetails};  } ));

但是,有某些条件。 https://www.learnrxjs.io/learn-rxjs/operators/combination/combinelatest

答案 2 :(得分:-1)

Max Koretskyi 的解决方案不是最新版本的 RxJs,我也弄错了。

“合并”有两个版本:

  • 与:

    import {merge} from 'rxjs';

你可以写:

this.globalChange$ =  merge(this.form.get("type"), this.form.get("departure"), ... )
  • 但是有:

    import {merge} from 'rxjs/operators';

你必须写:

this.globalChange$ =  this.form.get("type").pipe(merge(this.form.get("departure"), ... ) )

请注意,最后一个版本已弃用!