我有两个系列:“车辆”和“客户”。在每辆车中,我都通过客户的文档 ID 注册客户。我需要使用存储在车辆文档中的密钥访问客户的标题,并将其显示在显示车辆列表的材料数据表中。但是,我似乎无法让它工作,我对此感到非常困惑。
下图显示了我需要使用另一个文档显示客户端标题的表格。其余值是从车辆自己的文档中提取的。
到目前为止,我对 switchMap 和 flatMap 的尝试都不成功(可能是由于缺乏使用这些运算符的经验)。唯一成功的尝试是通过嵌套的 observable 查询从 "vehicles" observable 获取客户端标题,但它的表现非常糟糕。(排序表格后客户标题消失)
这就是我获取可观察车辆的方式:
this.vehicles$ = this.afs.collection<IVehicle>(`vehicles`);
this.vehicles = this.vehicles$.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as IVehicle;
const $key = a.payload.doc.id;
return { $key, ...data };
});
})
);
这就是我能够获取标题的方式(排序表事件中的故障 - 标题由于某种原因消失了)
this.vehicles = this.vehicles$.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as IVehicle;
const $key = a.payload.doc.id;
const client = data.client;
const clientTitle = this.afs
.doc(`clients/${client}`)
.snapshotChanges()
.pipe(
map(foo => {
const dataFoo = foo.payload.data() as IClient;
let titleString = dataFoo.title;
if (client) {
return { titleString, ...dataFoo };
} else {
titleString = 'N/A';
return { titleString, ...dataFoo };
}
})
);
return { clientTitle, $key, ...data };
});
})
);
我在尝试使用 switchMap 时一定做错了,因为我似乎无法从车辆文档中获取文档 ID,即使车辆接口包含“客户端”字段。(见下图)这就是为什么我没有完成那个片段来返回粒度值以附加到“车辆”可观察对象上。
我似乎无法理解我做错了什么,我将不胜感激任何显示处理这些类型查询的“正确”方法的方向。