2

Предполагая, что мне нужно получить все предметы из заказа предметов.Loop через angularfire2 list

  • мне нужно, чтобы получить ключи элемента из заказа
  • перебирать каждый ключ элемента и подписаться на каждую .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 выполняется. Конечно, я могу проверить список для дублирования позже, но я уверен, что есть лучший способ.

Мой вопрос - Есть ли лучший способ сделать это?

ответ

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.

+0

Не уверен, что делает 'preserveSnapshot', но проблема остается - и это не имеет никакого отношения к этому. Я думаю, что эта проблема возникает из-за того, что наблюдаемый поток не очень хорош. – TheUnreal