Оп! Существует несколько способов сделать это. Вызов .list()
возвращает FirebaseListObservable
, который является только Observable
с использованием некоторых удобных методов, таких как .push()
, .set()
, .update()
и .delete()
.
Самый простой способ - позвонить .subscribe()
и выполнить итерацию по фактическому массиву.
af.database.list('/songs').subscribe(songs => {
// songs is the downloaded array
// type could simply be any[] or whatever model you need
this.songs = songs;
// or you can forEach or whatnot
this.songs.forEach(song => console.log(song));
});
Чем более выгодный способ заключается в использовании Observable
оператора как .map()
:
af.database.list('/songs')
// Almost like a regular array map, but it emits for each item
// added over time
.map(song => {
song.name = song.name.toUpperCase();
return song;
})
.subscribe(songs => {
// songs is the downloaded array
this.songs = songs;
// All the names will be in caps
this.songs.forEach(song => console.log(song.name));
});
Убедитесь, что вы импортировать оператор .map()
, хотя и он не будет работать!
import 'rxjs/add/operator/map`
отличное объяснение! Я редактировал свой пост, вы можете понять, почему это неправильно? –
Да AngularFire разворачивает снимок по умолчанию, поэтому нет необходимости вызывать '.val()'. Имя параметра не должно быть «моментальными снимками», потому что это фактическое POJO, а не 'DataSnapshot' –
здесь // песни - это загруженный массив this.songs = songs; , какой тип загруженного массива? как заявить об этом? –