如何使用AngularFire、Firestore和Firebase分页到上一页
对不起,我看到这个问题在这里以不同的方式被问了很多次,例如:如何使用AngularFire、Firestore和Firebase分页到上一页,angular,firebase,google-cloud-firestore,angularfire,Angular,Firebase,Google Cloud Firestore,Angularfire,对不起,我看到这个问题在这里以不同的方式被问了很多次,例如: 但没有一个答案能够真正解释解决方案,也无法理解 我还阅读了许多教程,如: 详情如下: 这就是我到目前为止所做的 let query = ref.orderBy(orderBy, asc ? 'asc' : 'desc').limit(limit); if (startAfter) { // Thiis works as it should query = quer
let query = ref.orderBy(orderBy, asc ? 'asc' : 'desc').limit(limit);
if (startAfter) {
// Thiis works as it should
query = query.startAfter(startAfter);
}
if (endBefore) {
// This here does not work or give the correct results. I get the first page.
query = query.endBefore(endBefore);
}
return query;
因此:
query=query.startAfter(startAfter)代码>按预期工作
然而:
query=query.endBefore(endBefore)
不会在该文档结束之前结束,我认为它已达到极限 所以我想我是从上面提到的github问题中得到启发的一条评论中解决了这个问题:
假设您有这个数组,并且正在按升序排序
A,
B,
C,
D,
E,
F,
你有两个结果的页面限制
当你在第三页的时候,你应该
E,
F
现在您需要转到上一页,您需要做的是:
颠倒排序顺序,我们的数据应该是[F,E,D,C,B,A]
在当前查看页面的第一个文档之后开始(在我们的案例E中)
查询firestore以获得结果(如限制为2)。您应该以相反的顺序获得,并在E
之后开始,即[D,C]
反转上述数组,使其成为[C,D]
完成
截至<代码>firebase@7.3.0
您可以使用Query.limitToLast(n:number)
方法-使分页数据的向后移动更加容易
您的实现细节可能如下所示:
功能下一页(最后一页){
返回ref.orderBy('age').startAfter(last.age).limit(3);
}
功能页(第一页){
返回ref.orderBy('age').endBefore(first.age).limitToLast(3);
}
@f.khantsis嘿!末日777?从年度股东大会地图?迪米特里奥斯·卡内洛普洛斯我们已经谈过了。这真是太糟糕了,更糟糕的是firebase团队没有帮助解决这些问题。谢谢你的建议。我一直在努力做到这一点。嘿@JimmyKane,回答得不错!他们甚至不想把这当作“一个问题”:虽然我知道他们的NoSQL数据库结构不能完全处理这种方法,但他们至少应该就如何以体面的方式解决这个问题发表意见,但他们更愿意简单地接受“Firestore不是你的DB”这一事实,这很糟糕,因为在Firebase中,没有SQL替代方案(或其他NoSQL可以处理这种方法)。谢谢Jimmy,我也将您的逻辑应用到了我的vuexfire应用程序中。唯一需要注意的是,如何使用文档快照对象(而不是数组)执行步骤4反转数组。在尝试为firestore
应用程序实现分页时,遇到了此解决方案,并对其进行了进一步研究。我想说,虽然这是一个可行的解决方案,但您可以很容易地超越您的使用限制。假设您在一个集合中有100个
文档,每页显示10个
文档,您现在是最后一页了。执行上一页意味着您将执行90
reads以转到上一页。对于1000
文档,这将是990
读取。你明白我的意思了。因此,如果有人打算用这种方式实现分页,请小心。您认为这应该是正确的答案吗?我这样问是因为我还没有尝试过这个,我不知道这是否有任何区别和最重要的限制。不需要更改,我只是想确保这个选项显示在这里,因为它是SDK中的一个全新功能。将仅适用于7.3或更高版本的应用程序。我将等待一段时间,让用户对您的应用程序进行升级,然后我将更改此内容,以便我们可以讨论我认为helplimitToLast()中的大部分内容为我提供了窍门(用于导航到上一页)。我做出了正确的回答,因为您得到了用户的选择:-D感谢:-D