计算表中的记录显然是一种手动操作,直到你们已经在工作中获得了一些漂亮的新功能;)
但是,我甚至坚持使用.on(' value',...)手动运行来获取计数:
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 :(得分:6)
使用“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.
});
答案 1 :(得分:6)
child_added事件没有“完成”的概念,因为随着时间的推移,孩子可以继续添加。如果您想立即计算的孩子,您可以使用'value'从该位置获取当前快照,然后计算子项。例如:
table.once('value', function(snapshot) {
var count = 0;
snapshot.forEach(function(childSnapshot) {
count++;
});
// do something with count.
});
或者,如果您希望计数不断更新,则可以使用.on()而不是上面的.once()。但这并不是理想的表现,因为你每次都会计算所有的孩子。幸运的是,您可以结合使用'child_added'和'value'来有效地保持计数:
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。
答案 2 :(得分:0)
在FB实现count作为返回函数之前,我想没有客户端循环通过任何返回记录的最佳方法是以REST方式获取它。
参考:What’s the best RESTful method to return total number of items in an object?