Ответ 1
Я разместил этот вопрос после долгого дня кодирования, и мой мозг был месиво.
Сегодня утром я сделал еще одну попытку, и, как это часто бывает, смог найти решение довольно быстро.
Решение:
Чтобы разбивать данные, нам нужна возможность произвольно вытащить отсортированные данные из середины списка. Вы можете сделать это, используя следующие функции, предоставляемые API Firebase:
startAt
endAt
limitToFirst
limitToLast
Более подробную информацию можно найти здесь.
В моем случае, так как мне нужны мои данные в порядке убывания, я буду использовать endAt
и limitToLast
.
Предполагая, что каждая из моих страниц будет иметь пять. Я бы написал свой первый запрос следующим образом:
ref.orderByChild('votes')
.limitToLast(5)
.once('value', function(snapshot) {
console.log('Snap: ', snapshot.val());
});
Это получает 5 элементов с наивысшим числом голосов.
Чтобы получить следующую страницу, нам нужно будет сохранить две части данных из результатов нашего последнего запроса. Нам нужно сохранить количество голосов и ключ для элемента с наименьшим количеством голосов. То есть последний пункт в нашем списке.
Используя эти данные, наш следующий запрос и все последующие запросы выглядят следующим образом:
ref.orderByChild('votes')
.endAt(previousVoteCount, previousKey)
.limitToLast(5)
.once('value', function(snapshot) {
console.log('Snap: ', snapshot.val());
});
В этом вопросе вы заметите, что я добавил endAt
. Это получает следующие 5 предметов с наибольшим количеством голосов, начиная с последнего в предыдущем списке. Мы должны включить ключ для последнего элемента в предыдущем списке, чтобы, если есть несколько элементов с одинаковым количеством голосов, он вернет список, начинающийся с правильного элемента, а не первый, который он найдет с этим номером голосов, которые могут находиться где-то посреди списка, полученного из исходного запроса.
Что это!