Firebase:如何从快照对象中提取值?

Yan*_*ber 7 javascript firebase

我是Firebase的新手,我很难尝试从快照对象中提取属性.通过文档,我应该能够以这种方式直接选择对象的内容:

snapshot.val().property_name
Run Code Online (Sandbox Code Playgroud)

但是,每次我尝试这样做时,我都会得到一个"未定义"的值.是的,我知道名称是正确的,并且该属性包含内容.

如果我这样做:

MyRoom.update({Marker1:'foo'});

MyRoom.on('child_added', function(snapshot)
{
   alert(snapshot.name()); // it returns Marker1
   alert(snapshot.val());  // it returns foo
});
Run Code Online (Sandbox Code Playgroud)

但如果相反,我尝试:

MyRoom.update({Marker1:'foo'});

MyRoom.on('child_added', function(snapshot)
{
   alert(snapshot.val().Marker1); // it returns undefined
});
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Fra*_*len 8

TL;博士; 你应该用MyRoom.on('value',你的情况.

您通常在Firebase中存储两种基本类型的数据:

  • 对象
  • 集合

对象

您通常存储的对象如下:

var MyRoom = new Firebase('your.firebaseio.com/someroom');
MyRoom.set({Name: 'This is my room', Owner: 'frank', Marker1:'bar'});
Run Code Online (Sandbox Code Playgroud)

如果要更新/修补对象,请执行以下操作:

MyRoom.update({Marker1:'foo'});
Run Code Online (Sandbox Code Playgroud)

要收听此特定房间的更改,请使用:

MyRoom.on('value', function(snapshot) {
  var val = snapshot.val();
  alert(JSON.stringify(val)); // {Name: 'This is my room', Owner: 'frank', Marker1:'foo'}
  alert(val.Marker1); // foo
});
Run Code Online (Sandbox Code Playgroud)

在这里,您总是可以获得整个对象,即使在更新它的单个属性之后也是如此.

集合

集合是对象列表.但是集合本身也是对象,因此您可以使用它来监视集合on('value'.但这意味着你不得不经常处理整个阵列,这通常是不切实际的.

您通常会处理集合中的单独条目.Firebase具有用于添加/删除/更新集合的特定事件.因此,要监听添加到集合中的新项目,您需要:

var MyRooms = new Firebase('your.firebaseio.com/rooms');
MyRooms.push({Name: 'This is my room', Owner: 'frank', Marker1:'bar'});

MyRooms.on('child_added', function(snapshot) {
  alert(snapshot.val());
});
Run Code Online (Sandbox Code Playgroud)

集合是对象是集合是对象是...

您的混淆源于您正在混合上面的集合逻辑和对象逻辑.虽然这通常不是你想要的,但它是完全有效的代码,这就是它执行的原因; 只是没有你想要得到的结果.

您可以如何使用"将对象视为集合"的示例:

var MyRoom = new Firebase('your.firebaseio.com/someroom');

MyRoom.update({Marker2:'snafu'});

MyRooms.on('child_added', function(snapshot) {
  // somebody added a property to MyRoom
});
Run Code Online (Sandbox Code Playgroud)

您可能希望"像对象一样处理集合"的示例:https: //stackoverflow.com/a/25551254/209103

  • 不应该`var obj = snapshot.val();```var val = snapshot.val();` (2认同)