jquery Datatables - как добиться выборки на стороне сервера и сортировки на стороне клиента

Я использую подключаемый модуль datatables для обработки наших таблиц. У нас есть этот вариант использования, когда нам нужно получить данные (с разбивкой на страницы) через вызов ajax с использованием bServerSide и sAjaxSource, но мы хотели бы просто отсортировать данные на этой странице, а не получать отсортированные данные с сервера, как в нашем случае это чтение было бы очень дорого.

Возможно ли это сделать? Если да, то подскажите, как поступить. Заранее спасибо!!


person kshtjsnghl    schedule 07.06.2011    source источник
comment
Итак, вы хотите отсортировать только одну страницу, а не весь набор результатов?   -  person Petah    schedule 07.06.2011
comment
вы когда-нибудь разобрались с этой проблемой? Нужно такое же решение!!   -  person SpoiledTechie.com    schedule 09.03.2013
comment
У вас есть уникальное требование, я ищу пользовательскую сортировку на стороне сервера по столбцам, таким как валюта, продолжительность времени и т. д.   -  person Riz    schedule 09.10.2015


Ответы (2)


Я читал это обсуждение, которое может вам помочь: в основном вы должны инициализировать таблицу с этими параметрами;

"bServerSide" : false,
"sAjaxSource" : "path to your ajax source"

Таким образом, данные загружаются только один раз, и вся фильтрация выполняется клиентом.

Если вы хотите загрузить больше данных, вы можете использовать fnReloadAjax. Вы можете прочитать это обсуждение темы. необходимость.

РЕДАКТИРОВАТЬ. С помощью конвейера вы можете избежать частых вызовов на сервер только для разбиения на страницы (если вы фильтруете данные, вызов выполняется на сервер). Если вы хотите получить данные на сервер только один раз, а затем отфильтровать данные на стороне клиента, вы должны отключить обработку на стороне сервера (белый набор параметров выше). Если вы отключите обработку на стороне сервера, вы можете предоставить пользователю способ получить дополнительные данные с сервера с помощью «fnReloadAjax» (например, кнопку).

Чего я до сих пор не понимаю, вам нужно получить какие-то другие данные с сервера или все, что пользователь получает первым, в порядке?

РЕДАКТИРОВАТЬ 2 - если вы не хотите вызывать сервер, вы можете вообще не использовать AJAX, улучшив существующую таблицу. Просто создайте сторону html-серверов следующим образом:

 <table width="770" border="0" id='rdr_home' class='tablesorter'>
        <thead>  
          <tr>
            <th>col1</th>
            <th>col2</th>
            <th>col3</th>
          </tr>
        </thead>
        <tbody>
    <?php 
    foreach ($rows as $row){
    //echo all rows here (be careful as for each row you must 
    //have as many <td> as the column: no colspan!
    }
    ?>
        </tbody>
    </table>

А затем создайте свой datatable, например, как это

oTable = $('.tablesorter').dataTable({
        "aaSorting": [[2, "asc"]],
        "bAutoWidth": false,
        "bFilter": false,
        "sDom": 'T<"clear">lfrtip',
        "aoColumns": [
                    { "sType": "html" },
                    { "sType": "html" },
                    null
                ],
        "oLanguage": {
            "sUrl": "templates/rhuk_milkyway/dataTables/media/language/it_IT.txt"
        }
    });

При этом у вас есть нумерация страниц и фильтрация на стороне сервера.

РЕДАКТИРОВАТЬ 3 - в случае, когда вы упомянули (таблицы данных заботятся о разбивке на страницы, но не требуют фильтрации), я думаю, вы должны добавить дополнительный плагин. Вы должны отключить фильтры и сортировщики данных на этапе инициализации, как это;

    "bFilter": false,
    "bSort": false,

А затем используйте другой компонент для сортировки, фильтрации того, что на экране. Решение с сортировкой и фильтрацией можно посмотреть здесь: http://silverwareconsulting.com/index.cfm/2008/10/2/jquery-autofiltering-table

(лично мне не нравится идея фильтрации по щелчку, но вы можете использовать это, если хотите использовать что-то большее на свой вкус), в любом случае вы не можете использовать встроенные фильтры datatables, если вы разрешаете серверную часть нумерация страниц

person Nicola Peluchetti    schedule 07.06.2011
comment
Итак, я думаю, что мой вариант использования должен быть обслужен, если я установил размер кэша равным 1 в примере с конвейерной обработкой. - person kshtjsnghl; 07.06.2011
comment
я отредактировал свой ответ. чтобы использовать конвейерную обработку, чтобы избежать вызовов на сервер, вы должны установить для iPipe очень высокое значение. - person Nicola Peluchetti; 07.06.2011
comment
Таким образом, вариант использования примерно такой: для критериев поиска общий набор результатов может составлять 10 000 строк. Поскольку он очень большой, мы хотим получать по 100 строк за раз (разбиение на страницы). Но я хочу, чтобы пользователь мог сортировать только эти 100 строк за раз. Таким образом, разбиение на страницы должно выполняться на стороне сервера, а не сортировка. Сортировка просто должна быть сделана на текущей странице. - person kshtjsnghl; 07.06.2011
comment
помните, что конвейерная обработка позволяет избежать обращений к серверу только для разбиения на страницы, а не для фильтрации. - person Nicola Peluchetti; 07.06.2011
comment
в любом случае, мы также можем избежать вызовов для сортировки. - person kshtjsnghl; 07.06.2011
comment
Вы когда-нибудь задумывались о том, чтобы вообще не использовать ajax? Просто создайте HTML-таблицу на любом языке, который вы используете, а затем добавьте к ней таблицы данных: в этом случае у вас не будет обращений к серверу! Вот как я использовал таблицы данных в течение первого года: серверная часть PHP для создания таблицы, а затем все остальное делается на стороне клиента: обязательно правильно отформатируйте таблицу html, чтобы таблицы данных работали, я опубликую пример после обеда! - person Nicola Peluchetti; 07.06.2011
comment
Но в этом примере мы не получаем следующие страницы с сервера, что является основным вариантом использования. Нужно сделать пагинацию. - person kshtjsnghl; 07.06.2011
comment
Хорошо, теперь я понял, что вам нужно. Вы должны использовать дополнительные плагины для достижения того, чего вы хотите, я думаю - person Nicola Peluchetti; 07.06.2011
comment
Ребята, я пытался сделать это без Ajax на DataTable с более чем 5 миллионами записей. Javascript не может справиться с переформатированием этой таблицы за разумное время. Не стесняйтесь доказывать, что я ошибаюсь, но в моих тестах это было некрасиво! - person bpeterson76; 07.06.2011
comment
Это сработало после сортировки с помощью плагина tablesorter. См. - stackoverflow.com/questions/6268791 / - person kshtjsnghl; 08.06.2011
comment
@kshtjsnghl Рад, что это наконец сработало! @bpeterson76 У меня были проблемы с клиентской частью всего в 1000 тысяч строк! - person Nicola Peluchetti; 08.06.2011

У меня работает что-то почти идентичное, и решение полностью конвейерно — ничего волшебного и нет необходимости объединять другие решения. Установите высокий объем конвейера — в моем случае я получаю по существу 5 «групп» результатов (страницы * результаты отображения) как вперед, так и назад — и верьте, что Datatables сделает все остальное.

В одном экземпляре моего приложения я имею дело с более чем 5 миллионами записей. Да, это много. Я провел массу тестов на различных элементах системы, включая запросы, оптимизацию базы данных, индексирование и использование шаблонов пользовательского интерфейса. Все указывает на то, что эта система является наиболее эффективной в данной ситуации. В вашем случае я настоятельно рекомендую проводить мониторинг производительности независимо от вашего решения пользовательского интерфейса, чтобы увидеть, какие (если таковые имеются) узкие места существуют. В моей системе с более чем 5 миллионами записей я рассчитываю примерно на 2-4 секунды времени запроса и +-5% нагрузки на страницу или сортировку, что, безусловно, управляемо. У меня есть сотни пользователей и довольно много других процессов, с которыми нужно иметь дело одновременно, и мы не наблюдаем заметного отставания с момента внедрения нескольких таблиц данных около 6 месяцев назад.

С точки зрения пользовательского интерфейса слабость сортировки только данных на экране заключается в том, что она не интуитивно понятна. Когда у меня есть доступ к тысячам или миллионам записей в сетке, и я сортирую или фильтрую их, я ожидаю увидеть сортировку и фильтрацию всех доступных записей. Звучит глупо, но помните, что вся наука о дизайне пользовательского интерфейса заключается в создании шаблонов, «знакомых» пользователю.

person bpeterson76    schedule 07.06.2011