Что я пытаюсь сделать
У меня есть список клиентов, у каждого клиента есть список идентификаторов счетов, я храню идентификаторы счетов как отдельные документы (содержащие только временную меткудля заказа, в то время как идентификатор документа совпадает с 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, а не подписываться.