Reputation: 16825
Sorry I have seen this question has been asked many times in different ways here such as:
But NONE of the answers really explain the solution or are understandable.
Also I went though many tutorials such as:
To details:
So here is what I have done so far
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;
So:
query = query.startAfter(startAfter);
works as expected.
However:
query = query.endBefore(endBefore)
does not end before that document I think it ends up to the limit.
Upvotes: 12
Views: 6043
Reputation: 9308
As of [email protected]
you can use the Query.limitToLast(n: number)
method - makes it much easier to move backward with paginated data.
Your implementation details might look something like this:
function nextPage(last) {
return ref.orderBy('age').startAfter(last.age).limit(3);
}
function prevPage(first) {
return ref.orderBy('age').endBefore(first.age).limitToLast(3);
}
Upvotes: 26
Reputation: 16825
So I think I solved it by a comment inspired by the github issue mentioned above:
Supposing you have this array and you are sorting ascending
A,
B,
C,
D,
E,
F,
And you have a page limnit of 2 results
Then when you are in the third page you should have
E,
F
Now you need to go to previous page and what you need todo is:
[F,E,D,C,B,A]
E
and that is [D,C]
[C,D]
Upvotes: 10