tl;drを介しstartAt
てFirebase で基本的なページネーションを実行するのは非常に複雑です。もっと簡単な方法があるはずです。endAt
limit
多数のユーザー送信用の管理インターフェイスを構築しています。私の最初の (そして現在の) アイデアは、単純にすべてを取得し、クライアントでページネーションを実行することです。ただし、2000 以上のレコード (それぞれ 5 ~ 6 個の小さな数値/文字列フィールドを含む) をフェッチすると、1.5 MB を超えるデータ ペイロードに起因する顕著な遅延が発生します。
現在、すべてのエントリは経由で追加されていますがpush
、巨大なリストをページ分割する方法について少し迷っています。
私が使用endAt
しているデータの最初のページをlimit
5 で取得するには:
ref.endAt().limit(10).on('child_added', function(snapshot) {
console.log(snapshot.name(), snapshot.val().name)
})
その結果、次のようになります。
-IlNo79stfiYZ61fFkx3 #46 John
-IlNo7AmMk0iXp98oKh5 #47 Robert
-IlNo7BeDXbEe7rB6IQ3 #48 Andrew
-IlNo7CX-WzM0caCS0Xp #49 Frank
-IlNo7DNA0SzEe8Sua16 #50 Jimmmy
まず、ページ数を把握するために、誰かがレコードを追加または削除するたびに更新される別のカウンターを保持しています。
第二に、私が使用しpush
ているので、特定のページの最後のレコードの名前がわからないため、特定のページに移動する方法がありません。つまり、このようなインターフェイスは現在不可能です。
簡単にするために、次/前のボタンを単純に配置することにしましたが、これには新しい問題もあります。前の結果セットの最初のレコードの名前を使用すると、次を使用して次のページに改ページできます。
ref.endAt(null, '-IlNo79stfiYZ61fFkx3').limit(5).on('child_added', function(snapshot) {
console.log(snapshot.name(), snapshot.val().name)
})
この操作の結果は次のとおりです。
-IlNo76KDsN53rB1xb-K #42 William
-IlNo77CtgQvjuonF2nH #43 Christian
-IlNo7857XWfMipCa8bv #44 Jim
-IlNo78z11Bkj-XJjbg_ #45 Richard
-IlNo79stfiYZ61fFkx3 #46 John
これで次のページができましたが、位置が 1 つずれているため、制限を調整して最後のレコードを無視する必要があります。
1 ページ戻るには、これまでに受け取ったすべてのレコードのリストをクライアントに個別に保持し、どの名前に渡すかを決定する必要がありstartAt
ます。
これを行う簡単な方法はありますか、それともすべてをフェッチすることに戻るべきですか?