循环通过angularfire2列表

时间:2016-10-20 15:31:05

标签: firebase firebase-realtime-database reactive-programming rxjs angularfire2

假设我需要从物品订单中获取所有物品。

  • 我需要从订单
  • 获取商品密钥
  • 遍历每个项目键并订阅每个.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已执行。当然,我可以稍后检查列表是否重复,但我确信有更好的方法。

我的问题 - 有没有更好的方法呢?

1 个答案:

答案 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。