Получение данных из объекта Firebase с помощью Angular2, angularfire2 и Typescript

В настоящее время я работаю над проектом с Angular 2 и angularFire2. Моя база данных выглядит так в Firebase: база данных:/

[{Name:test1},
{Name:test2},
{Name:test3}]

Все элементы также имеют ключ Firebase.

Теперь я пытаюсь получить данные из Firebase с Observabels из RX. Когда я это сделаю, я получаю имена в консоли:

let items= af.database.list('/data').map(i=>{return i});
items.forEach(i=>i.forEach(e=>(console.log(e.name))));

Выход: test1, test2, test3. Все работает.

Но когда я делаю это:

console.log(items.first());

Я получаю обратно FirebaseListObservable.

Как я могу получить только первый объект из FirebaseListObservable? Как я могу редактировать элементы в списке? например:

items[0].name=test3

И как я могу получить ключ Firebase от элемента

как я могу получить FirebaseKey из элемента в списке?

Ответ 1

Observables - это асинхронная структура данных, что означает, что вы действительно не знаете, когда данные будут доступны, вам нужно подписаться на Observable и дождаться, когда данные станут доступными в next обработчик.

items.first().subscribe(x => console.log(x.name));

Кроме того, Observable не является статическим, поэтому вы не можете индексировать его как таковой. Если вам нужен только первый элемент, я бы предложил вместо этого извлечь значение и изменить его с помощью комбинации flatMap + first + map.

af.database.list('/data')
  //Convert array into Observable and flatten it
  .flatMap(list => list)
  //Get only the first item in this list
  .first()
  //Transform the value
  .map(({name, firebaseKey}) => ({name: "test3", firebaseKey}))
  //Subscribe to the stream
  .subscribe(x => console.log(x));