我是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
});
我做错了什么?
答案 0 :(得分: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'});
如果您想要更新/修补对象,您可以按照以上方式进行操作:
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());
});
您的困惑源于您从上面混合收集逻辑和对象逻辑这一事实。虽然这通常不是你想要的,但它是完全有效的代码,这就是它执行的原因;只是没有你想要得到的结果。
您可以如何使用&#34;像对象一样处理对象的示例&#34;:
var MyRoom = new Firebase('your.firebaseio.com/someroom');
MyRoom.update({Marker2:'snafu'});
MyRooms.on('child_added', function(snapshot) {
// somebody added a property to MyRoom
});
您可能希望&#34;像对象一样处理集合的示例&#34;:https://stackoverflow.com/a/25551254/209103