Firebase: как извлечь значения из объекта snapshot?
Я новичок в Firebase, у меня плохое время, пытаясь извлечь свойства из объекта snapshot. Как и в документации, я должен иметь возможность напрямую выбирать содержимое объекта таким образом:
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
});
что я делаю не так?
1 ответов
tl; dr; вы должны использовать 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'
. Но это означало бы, что вам постоянно приходится иметь дело со всем массивом, что чаще всего не практично.
обычно вы имеете дело с отдельными записями в коллекции. Военнослужащих есть определенные события для добавления/удаления/обновления коллекции. Поэтому для прослушивания новых элементов, которые добавляются в коллекцию, вы делаете:
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