Получить массив идентификаторов из хранилища, чтобы получить документы из другой коллекции с такими же идентификаторами и объединить их результаты в Observable? - PullRequest
0 голосов
/ 02 марта 2019

Что я пытаюсь сделать

У меня есть список клиентов, у каждого клиента есть список идентификаторов счетов, я храню идентификаторы счетов как отдельные документы (содержащие только временную меткудля заказа, в то время как идентификатор документа совпадает с invoiceID).То, что я хочу сделать, это получить эти идентификаторы счетов в виде массива, а затем получить фактические счета из коллекции счетов по идентификатору, объединить их результаты в одну наблюдаемую.До сих пор мне удавалось только получить Observable []>

То, что я пытался

this.invoice$ = this.fs.collection('data').doc('admin').collection('customers').doc(this.customer.id)
.collection('invoiceIDs').snapshotChanges().pipe(
  map(idSnapshots => idSnapshots.map(id => this.fs.collection('data').doc('admin')
  .collection('invoices').doc(id.payload.doc.id).valueChanges().pipe(map(invoice => new InvoiceModel({
    id: id.payload.doc.id,
    ...invoice
  })
)))));

Это, как я уже сказал, приводит к массиву Observable of Observable или Observable []>.

Результат, который я хочу

Результат, который я хочу получить, получить массив идентификаторов, как snapshotChanges, сопоставить их для получения идентификатора, получить документы из «счетов»коллекция, которая принадлежит этим идентификаторам, так что я могу использовать * ngFor = "let invoice of (invoice $ | async)", чтобы отобразить каждый счет в виде карточки.

Мое текущее неаккуратное решение

Прямо сейчас я могу достичь аналогичного результата, подписавшись на идентификаторы и назначив подписанные идентификаторы другому компоненту, что является грязным решением, как показано здесь:

this.subs.push(this.fs.collection('data').doc('admin').collection('customers').doc(this.customer.id)
.collection('invoiceIDs').snapshotChanges().pipe(map(ids => ids.map(id => id.payload.doc.id))).subscribe(ids => {
  this.invoiceIDs = ids;
  this.cdref.detectChanges();
}));

Затем я использую* ngFor для получения каждого идентификатора счета

<ng-container *ngFor="let invoice of invoiceIDs">

Назначение каждого идентификатора компоненту, который я называю

<m-finance-frame [id]="invoice">

, который дает результаты, которые я хочу, но, как я уже сказал, выглядит как грязное решение.Пытаясь решить эту проблему, сделав один Observable, который я могу использовать с (Observable | async) поверх HTML, а не подписываться.

...