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