簡體   English   中英

為什么 Rxjs combineLatest 既取決於訂閱,又取決於其中一個更改時不調用?

[英]Why Rxjs combineLatest depends on both subscription and not call when one of them changed?

如圖所示,我有兩個訂閱項目: 在此處輸入圖像描述

其中之一是搜索輸入,另一個是選擇過濾器。 當其中一個或兩個都發生變化時,我想改變結果。 我使用 Rxjs combineLatest 所以當它們或搜索輸入發生變化時,一切正常,但是當首先更改合作伙伴類型時,響應沒有改變。

ngOnInit() {
super.ngOnInit();
this.getAllPartners();

combineLatest([this.searchPartnerFc.valueChanges, this.filterFc.valueChanges])
  .pipe(
    switchMap(([search, filter]) => {
      let partnersBySearch = this.getSearchResult(search);
      let partnersByFilter = this.getFilterResult(filter);

      this.partners = partnersBySearch.filter(item => partnersByFilter.indexOf(item) > 0);
      return this.partners;
    }),
  )
  .subscribe();
}

getFilterResult(filterKey: string) {
    if (filterKey == 'All') return this.allPartners;
    else return this.allPartners.filter(partner => partner.partnerType == filterKey);
}

getSearchResult(searchString: string) {
    return this.allPartners.filter(x => x.partnerName.toLowerCase().includes(searchString));
}

我認為由於combineLatest運算符的性質,它不起作用。 只有當兩個可觀察對象都首先發出初始值時,它才會發出。 因此,當只有第一個 observable 發出而第二個沒有發出時,它不會做任何事情: https://www.learnrxjs.io/learn-rxjs/operators/combination/combinelatest

我認為您在這里需要一個合並運算符:https://www.learnrxjs.io/learn-rxjs/operators/combination/merge

還請在此線程上查看: 如何在 RxJS 中“等待”兩個可觀察對象

您可以通過使用startWith為每個源 observables 提供默認發射來實現您想要的結果:

combineLatest([
  this.searchPartnerFc.valueChanges.pipe(startWith('')), 
  this.filterFc.valueChanges.pipe(startWith('All'))
]).pipe(
  ...
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM