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

7

我是Firebase的新手,尝试从快照对象中提取属性时遇到了困难。根据文档,我应该能够通过以下方式直接获取对象内容:

snapshot.val().property_name

每次我尝试这样做时,都会得到一个“未定义”的值。是的,我知道名称是正确的,该属性有内容。
如果我这样做:
MyRoom.update({Marker1:'foo'});

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

但是如果我尝试:

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

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

我做错了什么?


这就是快照的工作原理。.val()返回值,除非它包含另一个名为Marker1的对象,否则它将返回未定义。在您的情况下,它只包含'foo'。 - webduvet
1个回答

8

简而言之,你应该在你的情况下使用MyRoom.on('value',

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

  • 对象
  • 集合

对象

对象通常是这样存储的:

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

如果您想更新/修补一个对象,您需要按照上述方式进行操作:
MyRoom.update({Marker1:'foo'});

要监听此特定房间的更改,您可以使用:

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
});

在这里,即使您只更新了一个属性,您仍然会获得整个对象。

集合

集合是对象的列表。但集合本身也是对象,因此您可以使用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());
});

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

你的困惑源于混淆了上面所述的集合逻辑和对象逻辑。虽然这通常不是你想要的结果,但它是完全有效的代码,这就是为什么它可以执行的原因;只是没有得到你想要的结果。

以下是一个如何“将对象视为集合”的示例:

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

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

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

当你需要“将集合视为对象”时的示例:https://stackoverflow.com/a/25551254/209103


非常感谢你的出色解释Frank!“value”事件提供的行为正是我所追求的。 - Yan Kleber
弗兰克,我认为这更好地解释为对象和集合,因为它们在技术上并不是数组。非常棒、有洞察力的答案! - Kato
哦……我确实更喜欢“collections”这个名称。我会看看能否更新答案,在适当的地方使用该名称。 - Frank van Puffelen
我认为名字并不重要,概念本身就很有说服力。 :) - Yan Kleber
2
var obj = snapshot.val(); 应该改为 var val = snapshot.val();,对吗? - nu everest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接