使用Angular2、angularfire2和Typescript从Firebase对象中获取数据

使用Angular2、angularfire2和Typescript从Firebase对象中获取数据,angular,firebase,firebase-realtime-database,rxjs,angularfire2,Angular,Firebase,Firebase Realtime Database,Rxjs,Angularfire2,我目前正在从事Angular2和angularFire2的项目。 在Firebase中,我的数据库如下所示: 基:/data [{Name:test1}, {Name:test2}, {Name:test3}] 所有物品都有Firebase钥匙 现在,我正试图通过RX的观测标签从Firebase获取数据。 执行此操作时,我会在控制台中获取名称: let items= af.database.list('/data').map(i=>{return i}); items.forEach(i

我目前正在从事Angular2和angularFire2的项目。 在Firebase中,我的数据库如下所示: 基:/data

[{Name:test1},
{Name:test2},
{Name:test3}]
所有物品都有Firebase钥匙

现在,我正试图通过RX的观测标签从Firebase获取数据。 执行此操作时,我会在控制台中获取名称:

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获取第一个对象? 如何编辑列表中的项目?比如:

items[0].name=test3
我如何从物品中获取Firebase密钥


如何从列表中的项目中获取firebaseKey?

可观察数据
是一种异步数据结构,这意味着您实际上不知道数据何时可用,您必须订阅
可观察数据
,并等待数据在
下一个
处理程序中可用

items.first().subscribe(x => console.log(x.name));
此外,
可观察的
不是静态的,因此不能将其作为索引。如果您只需要第一项,那么我建议您提取值并使用
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));

谢谢,这对我真的很有帮助。如果你想循环这些项目,而不仅仅是第一个项目呢?@Lloyd,那么你会使用
flatMap
而不是
first
你有flatMap。那么只需取出first()?是的,在这种情况下只需删除
first