如何使用 AngularFire、Firestore 和 Firebase 分页到上一页

How to paginate to previous page using AngularFire, Firestore and Firebase

抱歉,我看到这个问题在这里以不同的方式被问过很多次,例如:

但是 NONE 的答案确实解释了解决方案或者是可以理解的。

我还浏览了很多教程,例如:

详情:

这是我到目前为止所做的

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, 

并且您的页面限制为 2 个结果

然后当你在第三页时你应该

E,
F

现在您需要转到上一页,您需要做的是:

  1. 颠倒排序顺序,我们的数据应该是[F,E,D,C,B,A]
  2. 在当前查看页面的第一个文档之后开始(在我们的例子中是 E)
  3. 查询 firestore 以获得结果(例如,您的限制为 2)。您应该以相反的顺序获得并在 E 之后开始,即 [D,C]
  4. 反转上面的数组,所以它将是[C,D]
  5. 完成

firebase@7.3.0 开始,您可以使用 Query.limitToLast(n: number) 方法 - 可以更轻松地向后移动分页数据。

您的实施细节可能如下所示:

function nextPage(last) {
   return ref.orderBy('age').startAfter(last.age).limit(3);
}

function prevPage(first) {
   return ref.orderBy('age').endBefore(first.age).limitToLast(3);
}