загрузить больше данных, используя endAt

1

Сначала я загружаю последние 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

Как преодолеть эту проблему

Теги:
firebase
firebase-realtime-database

1 ответ

1
Лучший ответ

Добавляя данные в массив, вы можете просто игнорировать его, если он соответствует ключу вашего запроса 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, а затем отбросив дубликат результата.

  • 0
    хорошая идея, но это технически означает, что я выбираю только 4 вместо 5 ... где я хочу получить 5 товаров
  • 1
    Я вижу, я думаю, что вы могли бы использовать limitToLast(6) для метода fetchMoreData чтобы получить еще один результат?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню