Сначала я загружаю последние 5 элементов из моего узла базы данных, используя limitToLast(5)
следующим образом:
var myData = [];
var firstKey;
var fetchInitialData(category){
firebase.database().ref(category).orderByKey().limitToLast(5).once('value' , function(snap){
addDatToArray(snap);
});
}
fetchInitialData('myCategory');
var addDatToArray = function(snap){
snap.forEach(function(child){
myData.push(child.val());
if(!firstKey){
firstKey = child.key;
}
});
}
У меня есть дополнительная кнопка загрузки, которая извлекает еще 5 элементов и подталкивает их к myData[]
. Поскольку я сохраняю firstKey
в исходной firstKey
я передаю ее endAt()
следующим образом:
var fetchMoreData(category){
firebase.database().ref(category).orderByKey().endAt(firstKey).limitToLast(5).once('value' , function(snap){
firstKey = null;
addDatToArray(snap);
});
}
Он работает нормально, но проблема заключается в том, что я получаю больше и ограничиваю данные с помощью endAt()
и endAt()
включает элемент в конце пинты. Таким образом, для каждой загрузки больше данных один элемент дублируется в массиве myData
.
Чтобы описать, рассмотрите пример folowimg:
моя структура данных
----category
--item1
--item2
--item3
--item4
--item5
--item6
--item7
--item8
--item9
--item10
1. на начальных выборки я выборка последние 5 элементов, которые являются пунктами 6-10 и firstKey
установлено значением item6
. элементы, отображаемые пользователю, являются
item6
item7
item8
item9
item10
2. on load more fetch firstKey
который является item6
, передается endAt()
и поскольку endAt()
он также извлекает item6
и подталкивает его к myData[]
элементы, отображаемые пользователю, являются
item6
item7
item8
item9
item10
item5
item4
item3
item2
item6//fetched again
Как преодолеть эту проблему
Добавляя данные в массив, вы можете просто игнорировать его, если он соответствует ключу вашего запроса endAt? Таким образом, ваш метод addDatToArray
будет принимать еще один аргумент, например:
var addDatToArray = function(snap, ignoreKey){
snap.forEach(function(child){
if(child.key != ignoreKey) {
myData.push(child.val());
}
if(!firstKey){
firstKey = child.key;
}
});
}
Из документов firebase.database.Query # endAt:
Конечная точка включена, поэтому в запрос будут включены дети с точно указанным значением.
Поэтому вам нужно будет это учитывать, limitToLast
на +1, а затем отбросив дубликат результата.
limitToLast(6)
для методаfetchMoreData
чтобы получить еще один результат?