tl;dr在 Firebase 中通过 执行基本分页,startAt
非常复杂endAt
,limit
必须有更简单的方法。
我正在为大量用户提交构建一个管理界面。我最初(和当前)的想法是简单地获取所有内容并在客户端上执行分页。然而,在获取 2000 多条记录(每条记录包含 5-6 个小数字/字符串字段)时存在明显的延迟,我将其归因于超过 1.5mb 的数据有效负载。
目前所有条目都是通过添加的,push
但我对如何通过巨大的列表进行分页有点迷茫。
要获取我正在使用的第一页数据endAt
,其中 alimit
为 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
现在我有了下一页,只是它移动了一个位置,这意味着我必须调整我的限制并忽略最后一条记录。
要后退一页,我必须在客户端上保留到目前为止我收到的每条记录的单独列表,并找出要传递给的名称startAt
。
有没有更简单的方法可以做到这一点,还是我应该回去取所有东西?