Firebase - заполнить свойство / массив дополнительными данными - PullRequest
0 голосов
/ 10 июня 2018

Наблюдаемая ниже создает массив объектов событий.

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() }));
});

Мне нужно добавить дополнительные данные к 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() }));
});

Edit --------

Я получил это далеко, используя 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)
  });

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
]

1 Ответ

0 голосов
/ 13 июня 2018

Вот пример, объединяющий 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;
  })
);

CombineLatest вернет новую наблюдаемую.Если один из 3 наблюдаемых выдает новое значение, объединение результатов запускается и выдает новое значение.Для получения дополнительной информации о том, как работает combLatest, посетите официальную документацию

...