Firebase - 使用其他数据填充属性/数组

Cip*_*ian 6 javascript firebase-realtime-database angularfire2 angular

下面的observable创建了一个事件对象数组.

eventsRef: AngularFireList<any>;
events: Observable<any>;

this.eventsRef = db.list('events');

this.events = this.eventsRef.snapshotChanges().map(changes => {

return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
});
Run Code Online (Sandbox Code Playgroud)

我需要this.events从其他数据库列表中添加其他数据.所以我需要每个事件对象包含一个访客计数和数据eventsFilters.我不知道该怎么做.这是我到目前为止:

this.events = this.eventsRef.snapshotChanges().map(changes => {

  changes.map(data => {
    console.log(data.payload.key)
    this.db.object(`/eventsFilters/${data.payload.key}`)
      .valueChanges()
      .subscribe(data => {
         console.log(data) //event filters
      })
  })

  changes.map(data => {
    console.log(data.payload.key)
    this.db.object(`/eventsGuests/${data.payload.key}`)
      .valueChanges()
      .subscribe(data => {
        let guestCount = Object.keys(data).length;
        console.log(guestCount)
        this.guestCount = guestCount; //guest count
      })
  })
  return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
});
Run Code Online (Sandbox Code Playgroud)

编辑--------

我已经使用了这个,combineLatest但我仍然不确定如何对每个事件数据进行分组.

this.eventsRef.snapshotChanges()
  .switchMap(
    (changes) => {
      let userQueries: Observable<any>[] = [];
      let lists: Array<string> = ['eventsFilters', 'eventsGuests'];

      changes.map(data => {
        for (let list of lists) {
          userQueries.push(this.db.object(`/${list}/${data.payload.key}`).valueChanges());
        }
      })

      userQueries.push(this.eventsRef.snapshotChanges());

      return Observable.combineLatest(userQueries);
    })
  .subscribe((d) => {
    console.log(d)
  });
Run Code Online (Sandbox Code Playgroud)

console.log(d) 输出这样的东西:

[
   {}, //object with data from eventsFilters for first event
   {}, //object with data from eventsGuests for first event
   {}, //object with data from eventsFilters for second event
   {}, //object with data from eventsGuests for second event
   ... 
   [{},{} ...] //array with all events
]
Run Code Online (Sandbox Code Playgroud)

Zso*_*aly 0

这是一个结合了 3 个可观察值的示例:

combinedData$ = combineLatest( entityList$, settings$, currentUser$).pipe(
  map(([entityList, pageSetting, currentUser]) => {
    //entityList, pageSettingand currentUser holds the last value emitted on each observables.

    if (!pageSetting.ShowAllOrganisation) {
      //If not showing all organisation, then we have to filter it
      retVal = entityList.filter(entity=> entity.organisationId === currentUser.organisationId);
    }

    return retVal;
  })
);
Run Code Online (Sandbox Code Playgroud)

组合最新将返回一个新的可观察值。如果 3 个可观察值之一发出新值,则将触发 mergeLatest 并发出新值。有关 mergeLatest 如何工作的更多信息,请访问官方文档