Ленивая загрузка на стороне клиента в плагин jquery DataTables из IndexedDB

Я уже некоторое время использую таблицы данных, но только недавно начал работать с IndexedDB. По большей части они работают вместе довольно хорошо, однако я столкнулся с небольшой проблемой.

Что я хочу сделать, так это загрузить данные из локальной базы данных, но не все сразу. Причина в том, что он загружает тысячи записей, что довольно медленно. Вместо этого я хотел бы сделать с indexedDB то, что я делал на стороне сервера: я отправляю часть записей и общий подсчет того, сколько записей на самом деле существует. DataTables может использовать эти две части информации для правильной разбивки на страницы.

Однако при этом используется параметр fnAjaxSource, который принимает URL-адрес. Мне нужно взять функцию, которая каким-то образом возвращает данные. Я не нашел никого, кто делал бы то же самое. В настоящее время я использую DataTables 1.9 для проекта, однако я мог бы использовать 1.10 для этой и подобных страниц, если это потребуется. Однако изучение API и документации не показало мне никаких способов сказать DataTables ожидать больше записей, чем он получает. Если вам нужна какая-либо другая информация, пожалуйста, дайте мне знать, но я не могу опубликовать пример, так как не знаю, что делаю. Я надеюсь, что есть простой вариант, или каким-то образом я мог бы написать подключаемый модуль, который делает это, но я не видел ничего, что вселяло бы в меня надежду.

Я задал вопрос аналогичным образом на форум DataTables здесь.

Я должен уточнить, что на самом деле у меня нет проблем с IndexedDB. Я отлично загружаю свои данные по частям, а также получаю подсчет общего количества записей, которые соответствуют моим критериям поиска. Проблема в том, что DataTables хотят получить все данные, а не только фрагмент, чтобы знать, сколько записей будет существовать и как выполнить разбиение на страницы.


person S. Buda    schedule 29.09.2014    source источник
comment
В дополнение к моему ответу, если вы ищете что-то помимо небольшого приложения, я бы предложил оболочку IndexedDB, например Декси. Он имеет такие функции, как offset и limit, которые упрощают получение данных для запросов DataTables. Есть и другие, это только тот, с которым я знаком.   -  person Chris Hunt    schedule 25.07.2015


Ответы (2)


Начиная с версии 1.10 вы можете передать функцию для параметра ajax при инициализации DataTable. Подробная информация содержится в ajax документации.

Как функция, выполнение вызова Ajax остается на ваше усмотрение [...] при желании можно использовать метод, отличный от Ajax, для получения необходимых данных, таких как веб-хранилище...

Когда данные получены из источника данных, следует вызвать второй параметр (здесь callback) с передачей одного параметра — данных, которые будут использоваться для рисования таблицы.

Итак, по существу:

$('#example').dataTable( {
  ajax: function (data, callback, settings) {
    // ... retrieve data using parameters in `data` ...
    // ... transform result into format expected by callback ...
    callback(transformed_result);
  }
});

Кроме того, если вы также включите обработку на стороне сервера, то аргумент data, переданный вашей функции, будет также включите свойства start, length и т. д., которые можно использовать для ограничения количества записей, запрашиваемых вами из IndexedDB.

person Chris Hunt    schedule 25.07.2015
comment
Привет! У меня небольшая проблема с этим, не могли бы вы провести меня по шагам? - person Kari dime; 29.11.2020

Я не совсем уверен, что понимаю тебя. IDB не похож на LocalStorage, где все загружается в память. У вас может быть огромное количество данных в IDB, а вы можете получить только крошечную часть. Посмотрите на использование Ranges с curses, чтобы открыть небольшую часть вашей таблицы.

Я предполагаю, что в основном я говорю о том, что из коробки, не делая ничего «специального», IDB поддерживает чтение фрагментами данных.

person Raymond Camden    schedule 30.09.2014
comment
Да, и я отлично читаю фрагменты данных, проблема в том, что DataTables ожидает, что «все» данные для нумерации страниц будут работать правильно. У него есть возможность разбивки на страницы на стороне сервера с использованием серверных вызовов с Ajax, но это не серверная сторона, и я не выполняю свои действия через Ajax, а просто использую простые функции javascript. Таким образом, похоже, что у него нет возможности иметь надлежащую разбивку на страницы на стороне клиента с использованием фрагментов данных, а только с целым набором данных. - person S. Buda; 30.09.2014
comment
Да, извините, я просто не очень хорошо знаю этот плагин. - person Raymond Camden; 01.10.2014