Angular Firebase MatTable 2 наблюдаемых в 1 - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть структура данных в моей базе данных Firebase, которая имеет ссылку на идентификатор пользователя.

Я пытаюсь «собрать объект вместе», но у меня возникают проблемы. Вот пример:

Исходные данные о моей коллекции:

{
city: new york,
country: usa
addedBy: feibf78UYV3e43 // This is the USER ID from the User Collection.
}

Что мне нужно сделать, это получить информацию о пользователе для каждого документа в моей коллекции, однако я получаю пользовательские данные как наблюдаемые, как я могу это сделать? Объект должен выглядеть следующим образом:

{
city: new york,
country: usa
addedBy: feibf78UYV3e43 // This is the USER ID from the User Collection.
addedByProfile: {
    firstName: John,
    lastName: Doe,
    age: 34
  }
}

Я попытался создать 2 подписки, но это не сработало.

Вот мой базовый c код без дополнительного запроса.

getAllIncome() {
        return this.incomeService.getAllIncomeShops().subscribe(
            snaps => {
                const incomeShops = snaps.map(snap => {
                    // I had the call to my UserService here on which I called the getUser() method passing the UID, however, I need to subscribe for that and it messes things up.
                    return {
                        id: snap.payload.doc.id,
                        ...snap.payload.doc.data()
                    } as IncomeShop;
                });
                this.showLoader = false;
                this.dataSource = new MatTableDataSource(incomeShops);
                this.dataSource.sort = this.sort;
                this.dataSource.paginator = this.paginator;
            }
        );
    }

1 Ответ

0 голосов
/ 22 февраля 2020

Вы можете попробовать это:

dataWithUser =[];
this.incomeService.getAllIncomeShops()
 .pipe(
      mergeMap(datas => {
        return datas.map(data => {
          return zip(of(data), this.userService.getUser(data.addedBy));
        });
      }),
      mergeAll()
    )
    .subscribe(([data, user]) => {
      dataWithUser = [...dataWithUser, { ...data, addedByProfile: user }];
    });

Одна проблема заключается в том, что Observable испускает каждый элемент массива по одному. Поэтому нам придется собрать их все в массив, как мы делаем здесь:

dataWithUser = [...dataWithUser, { ...data, addedByProfile: user }];
...