如何在角度中正确合并可观察流(来自Firestore)。有效地符合逻辑OR

时间:2018-03-30 21:26:20

标签: angular rxjs google-cloud-firestore

我正在使用动态查询参数执行多个Firestore查询,以尝试将它们全部合并并获得有效的逻辑OR输出。

因此,在for循环中,我将所有数据库查询输出收集到一个数组中,然后使用spread运算符将它们合并在一起。

所有内容似乎都按预期工作 - 如果我订阅单个合并的observable和日志输出,我将从不同的单个查询获得输出!

当我将单个合并的observable传递给async并尝试使用ngFor迭代各个项时,HTML中出现了问题。它就好像observable是空的。

* TS:

private getMergedEvents(queryParameters: string[]){
    let observables: Observable<any[]>[] = [];
    let temp_observable: Observable<any[]>;

    //Loop through the list of bills and build dynamic queries
    queryParameters.forEach((bill, index) =>{
      temp_observable =
        this.db.collection(
          'daily_file/',
          ref => ref.where('bill_ids.' + bill, '==', true)
        ).valueChanges()

      //Use a temporary array and merge afterwards for clarity.
      observables[index] = temp_observable;
    })

    //Merge all of the observables to combine into one
    this.eventObservables = Observable.merge(...observables)
    this.eventObservables.subscribe(events =>{
      for(let event of events) {
        console.log(event.date)
      }
    })
  }

输出: enter image description here

* HTML:

  <ion-list>
    <ion-item *ngFor="let event of eventObservables | async">
      <h1>static text</h1>
      <h1>{{event.date}}</h1>
    </ion-item>
  </ion-list>
</ion-content>

如上所述,屏幕上不显示任何内容(甚至不是静态文本),表明观察者是空的。

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

您正在为同一个observable订阅两次,并且默认情况下observable不是多播。您可以使用Subject来实现该结果,或者创建一个可观察的多播,如下所述:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-multicast