2012-07-23 36 views
4

計數記錄在表顯然是一種手工勞動,直到你們得到一些已經在作品中那個漂亮的新功能;)的火力地堡記錄總數(我何時能完成計數)

然而,我「M卡上使用,甚至用。對手動運行(」值」,......)來獲取計數:

var table = new Firebase('http://beta.firebase.com/user/tablename'); 
var count = 0; 
table.on('child_added', function(snapshot) { 
    count++; 
    // how do I know if this is the last child? i.e. the count is complete? 
}); 

// when is it okay to use count? 

我預見到同樣的問題與任何類型的分頁的,我覺得我對此有點不屑一顧。我錯過了什麼?

這從根本上說是錯誤的模式,例如,獲取用戶在他/她的隊列中的消息數量?

+0

試試這個 使用JavaScript對象計數,它的工作。 http://stackoverflow.com/questions/5223/length-of-a-javascript-object – wwin3286tw 2016-11-27 17:08:03

回答

5

使用「child_added」時,無法知道何時收到「最後」項目。如果你正在尋找計算所有在時間上的特定點存在的孩子,我會建議使用「值」事件如下:

var table = new Firebase('http://beta.firebase.com/user/tablename'); 

table.on('value', function(snapshot) { 
    var count = 0; 
    snapshot.forEach(function() { 
     count++; 
    }); 
    //count is now safe to use. 
}); 
+0

是的,被封鎖了。我使用'forEach'打折,因爲它需要在父級上調用'value',這在大型表上可能是一個很大的開銷。某處,我完全滑倒了它。 :) – Kato 2012-07-23 19:41:08

5

的child_added事件沒有的概念「完成」 ,因爲隨着時間的推移,孩子可以繼續增加。如果您想要計算目前的,您可以使用'值'從當前位置獲取當前快照,然後對孩子進行計數。例如:

table.once('value', function(snapshot) { 
    var count = 0; 
    snapshot.forEach(function(childSnapshot) { 
    count++; 
    }); 
    // do something with count. 
}); 

另外,如果你想計數不斷更新,你可以使用。對()以上()代替。一旦。但是這不是最理想的表現,因爲你每次都會計算所有的孩子。幸運的是,你可以使用「child_added」和「價值」的組合,以有效地保持數:

var count = 0; 
table.on('child_added', function(snapshot) { 
    count++; 
    // how do I know if this is the last child? i.e. the count is complete? 
}); 

table.on('value', function(snapshot) { 
    // do something with count. 
}); 

這工作,因爲「價值」是經過「初始」的數據完整,然後再次每當將觸發一次數據發生變化,所以你會得到不斷更新的正確數量。儘管如果您希望孩子被移除,您還需要處理child_removed。

+0

對,由於某種原因,我忘了獲取快照並在我們討論了在父表上調用'value'的開銷之後使用forEach。我的大腦聽到了什麼:「刪除價值/ forEach從內存中」:(看到?我知道這是顯而易見的。 – Kato 2012-07-23 19:42:50

+0

哈哈。好吧,很高興現在有意義。:-) – 2012-07-23 20:54:41