4

计算表中的记录显然是一项手动工作,直到你们获得一些已经在工作中的漂亮新功能;)

但是,即使使用带有 .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?

我预见到任何类型的分页都会出现同样的问题,我觉得我对此有点呆滞。我错过了什么?

例如,对于获取用户在他/她的队列中的消息数量,这从根本上来说是错误的模式吗?

4

3 回答 3

7

child_added 事件没有“完成”的概念,因为随着时间的推移可以继续添加孩子。如果您想立即计算孩子的数量您可以使用“值”从该位置获取当前快照,然后计算孩子的数量。例如:

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 。

于 2012-07-23T19:12:21.357 回答
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.
});
于 2012-07-23T19:10:48.550 回答
0

在 FB 将 count 实现为返回函数之前,我想不让客户端循环通过任何返回的记录的最佳方法是通过 REST 方式获取它。

参考:返回对象中项目总数的最佳 RESTful 方法是什么?

于 2014-10-21T11:00:35.280 回答