2014-08-27 15 views
5

Ich bin neu in Firebase und habe eine schlechte Zeit versucht, Eigenschaften aus Snapshot-Objekt zu extrahieren.Firebase: Wie extrahiert man Werte aus einem Snapshot-Objekt?

snapshot.val().property_name 

Doch jedes Mal, wenn ich versuche zu tun, dass ich einen ‚undefined‘ Wert zu erhalten: Wie von der Dokumentation, soll ich auf diese Weise direkt den Inhalt des Objekts holen kann. Ja, ich weiß, dass der Name korrekt ist und dass die Eigenschaft Inhalt hat.

Wenn ich dies tun:

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

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

Aber wenn ich stattdessen versuchen:

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

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

Was mache ich falsch?

+0

Das ist, wie Schnappschuss funktioniert. .val() gibt den Wert zurück und gibt undefined zurück, es sei denn, es enthält ein anderes Objekt mit dem Namen Marker1. In Ihrem Fall enthält es nur 'foo' – webduvet

Antwort

6

tl; dr; Sie sollten MyRoom.on('value', für Ihren Fall verwenden.

Sie speichern typischerweise zwei grundlegende Arten von Daten in Firebase:

  • Objekte
  • Sammlungen

Objekte

Objekte Sie in der Regel wie folgt speichern:

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

Wenn Sie aktualisieren möchten/Patch ein Objekt, was Sie tun, wie Sie es oben tun:

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

für Änderungen an diesem bestimmten Raum zu hören, verwenden Sie:

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

Hier bekommen Sie immer die gesamten Objekte, auch nachdem Sie eine einzelne Eigenschaft davon aktualisieren.

Kollektionen

Sammlungen sind Listen von Objekten. Aber Sammlungen sind selbst auch Objekte, so dass Sie eine Sammlung mit on('value' überwachen können. Aber das würde bedeuten, dass Sie ständig mit dem gesamten Array umgehen müssen, was meistens nicht praktikabel ist.

Normalerweise behandeln Sie die einzelnen Einträge in der Sammlung. Firebase verfügt über spezifische Ereignisse für das Hinzufügen/Löschen/Aktualisieren der Sammlung. Also für neue Objekte zu hören, die zu einer Sammlung hinzugefügt werden, was Sie tun:

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

Kollektionen sind Objekte sind Sammlungen sind Objekte sind ...

Ihre Verwirrung rührt von der Tatsache, dass Sie die abmischen Sammlungslogik und Objektlogik von oben. Obwohl dies nicht oft das ist, was Sie wollen, ist es vollständig gültiger Code, weshalb er ausgeführt wird; nur nicht mit dem Ergebnis, das du suchst.

Ein Beispiel, wie Sie „behandelt ein Objekt wie eine Sammlung“ verwenden könnten:

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

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

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

Ein Beispiel, wann Sie wollen „eine Sammlung wie ein Objekt behandeln“: https://stackoverflow.com/a/25551254/209103

+0

Vielen Dank für Ihre tolle Erklärung Frank! Das Verhalten, das durch das Ereignis 'value' bereitgestellt wird, ist genau das, wonach ich gesucht habe. –

+0

Perfekt. Ich habe diese Verwirrung in der Vergangenheit gesehen, weshalb ich eine etwas längere Erklärung geschrieben habe. Wenn dies die Antwort ist, nach der Sie gesucht haben, klicken Sie auf das Häkchen links neben der Frage. –

+0

Definitiv das ist die Antwort, die ich suchte. Überprüft !!! :) –

Verwandte Themen