假设我需要从物品订单中获取所有物品。
.database.object
以获取项目详细信息。 let myItems = [];
let orderItems = this.af.database.list('/order_items');
this.orderItems.subscribe((itemKeys) => {
itemKeys.forEach((itemKey) => {
let item = this.af.database.object('/items/'itemKey.$value);
item.subscribe((itemData) => {
myItems.push(itemData);
});
});
});
这可能会有问题,因为orderItems
订阅尚未完成且forEach
已执行。当然,我可以稍后检查列表是否重复,但我确信有更好的方法。
我的问题 - 有没有更好的方法呢?
答案 0 :(得分:2)
我认为您可以通过指定preserveSnapshot选项将数据作为原始快照获取,如下所述: Retrieving the snapshot 然后根据需要进行迭代。
let myItems = [];
let orderItems = this.af.database.list('/order_items',
{ preserveSnapshot: true }
);
this.orderItems.subscribe((itemKeys) => {
itemKeys.forEach((itemKey) => {
let item = this.af.database.object('/items/'+itemKey.key);
item.subscribe((itemData) => {
myItems.push(itemData);
});
});
})
我认为您也可以立即将items
的密钥映射到order_items
,类似于此处:AngularFire for Angular 2,但我不知道该怎么做,因为我是新的ng2,af2和firebase。