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イベントには、「完了」の概念はありません。これは、子が時間の経過とともに追加され続ける可能性があるためです。今すぐ子の数を取得したい場合は、「value」を使用してその場所から現在のスナップショットを取得し、子を数えることができます。例えば:

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

または、カウントを継続的に更新する場合は、上記の.once()の代わりに.on()を使用できます。ただし、毎回すべての子をカウントするため、これはパフォーマンスの観点からは理想的ではありません。幸い、「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.
});

これは、「初期」データが完了した後に「value」が1回起動し、データが変更されるたびに再度起動するため、機能します。したがって、正しいカウントが継続的に更新されます。ただし、子が削除されることを期待する場合は、child_removedも処理する必要があります。

于 2012-07-23T19:12:21.357 に答える
6

「child_added」では、「最後の」アイテムをいつ受け取ったかを知る方法はありません。特定の時点で存在していたすべての子をカウントする場合は、次のように「value」イベントを使用することをお勧めします。

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が返された関数としてカウントを実装するまで、返されたレコードをクライアント側でループさせないための最良の方法は、RESTの方法でフェッチすることだと思います。

ref:オブジェクト内のアイテムの総数を返すための最良のRESTfulメソッドは何ですか?

于 2014-10-21T11:00:35.280 に答える