2014-08-27 106 views
5

我是Firebase的新成員,嘗試從快照對象提取屬性時遇到了困難。正如文件,我應該能夠直接這樣挑對象的內容: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

那怎麼快照的作品。 .val()返回值,它返回undefined,除非它包含名稱爲Marker1的另一個對象。在你的情況下,它只包含'foo' – webduvet 2014-08-28 09:40:47

回答

6

tl; dr;你應該使用MyRoom.on('value',你的情況。

您通常存儲兩種基本類型的數據在火力地堡:

  • 對象
  • 收藏

對象,你通常存儲這樣

對象:

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 obj = 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

+0

非常感謝你的真棒解釋弗蘭克! '價值'事件提供的行爲正是我所追求的。 – 2014-08-28 13:31:42

+0

完美。過去我看到了這種混亂,這就是爲什麼我寫了一個更長的解釋。如果這是您正在尋找的答案,請點擊問題左側的複選標記。 – 2014-08-28 13:32:53

+0

明確地說,這是我正在尋找的答案。經過!!!! :) – 2014-08-28 14:29:40