angular - 从 firestore 获取 ID 数组以从具有相同 ID 的另一个集合中获取文档,并将其结果组合到 Observable 中?
问题描述
我正在尝试做的事情
我有一个客户列表,每个客户都有一个发票 ID 列表,我将发票 ID 存储为单独的文档(仅包含订单的时间戳,而文档 ID 与 invoiceID 相同)。我想要做的是,将这些发票 ID 作为一个数组获取,然后按 ID 从发票集合中获取实际发票,将它们的结果组合成一个 Observable。到目前为止,我只能设法获得 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 数组或 Observable[]> 的 Observable。
我想要的结果
我想要的结果是,获取 ID 数组,作为 snapshotChanges,将它们映射到获取 ID,从属于这些 ID 的“发票”集合中获取文档,这样我就可以使用 *ngFor="let invoice of (invoice$ | async )”以将每张发票显示为一张卡片。
我目前草率的解决方案
现在,我可以通过订阅 ID 并将订阅的 ID 分配给不同的组件来获得类似的结果,这是一个混乱的解决方案,如下所示:
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 来获取每个发票 ID
<ng-container *ngFor="let invoice of invoiceIDs">
将每个 ID 分配给我调用的组件
<m-finance-frame [id]="invoice">
这给出了我想要的结果,但就像我说的,感觉就像一个混乱的解决方案。试图通过制作一个 Observable 来解决这个问题,我可以在 HTML 上使用 (Observable | async) 而不是订阅。
解决方案
推荐阅读
- python - tkinter 滚动条未按预期应用选项
- typescript - 如何访问内联子类型
- sql - 快速 Spark 替代 WHERE 列 IN other_column
- node.js - 如何使用 Node js 将数据发送到 Jasper Report?
- c++ - 调用 curl_easy_init() 时 .DLL 无法注入
- firebase - Firestore DB 和 Firebase Cloud Functions 的不同区域
- windows - 无法在 Windows 上的 perl 中获取系统语言环境
- ios - 如何使用 SwiftUI 在详细视图上编辑和覆盖 CoreData
- class - 抽象类传递对对象的引用
- css - VS Code 仅针对 CSS 更改主题颜色