Разбиение на страницы jQuery datatables прервано после перехода на обработку на стороне сервера - PullRequest
2 голосов
/ 08 марта 2012

У меня была страница, которая инициализировала пустую dataTable и получала данные json с помощью $ .getJSON () после изменения jquery из select. Затем он добавлялся в таблицу с помощью .fnAddData.Like this:

oTableDisk = $('#disk_connection_table').dataTable({
        "bJQueryUI": true,
        "iDisplayLength": 30,
        "oLanguage": {
            "sLengthMenu": tableLength
        },
        "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull){
            $(nRow).attr('id', aData[0] + "|<?php echo $this->hostInfo['name']; ?>|<?php echo $this->hostInfo['id']; ?>");
            return nRow;
        },
        "aoColumns": [{"bSearchable": false, "bVisible": false}, null, null, null, null, null, null]
    });

$('#disk_switch').change(function(){
        $.getJSON('/host/getavailableports?type=disk&switch=' + $('#disk_switch option:selected').val(), function(data){
            if(data[0]){
                data.reverse();
                oTableDisk.fnClearTable();
                $.each(data, function(index){
                //console.log(data[index]);
                    oTableDisk.fnAddData([data[index]['Item1'],
                                        data[index]['Item2'], 
                                        data[index]['Item3'], 
                                        data[index]['Item4'], 
                                        data[index]['Item5'], 
                                        data[index]['Item6'], 
                                        data[index]['Item8']]);

                });
                enableEditable(oTableDisk);
            }
        });
    });

Это работало нормально до тех пор, пока нам не потребовалось обработать более 500 строк информации и не работало с IE из-за ошибок «скрипт перестал отвечать».

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

 $('#disk_switch').change(function(){
        oTableDisk = $('#disk_connection_table').dataTable({
            "bJQueryUI": true,
            "iDisplayLength": 30,
            "bProcessing": true,
            "bServerSide": true,
            "bDestroy": true,
            "sAjaxSource": '/host/getavailableports?type=disk&switch=' + $('#disk_switch option:selected').val(),
            "aaSorting": [[0, "asc"]],
            "oLanguage": {
                "sLengthMenu": tableLength
            },
            "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull){
                $(nRow).attr('id', aData[0] + "|<?php echo $this->hostInfo['name']; ?>|<?php echo $this->hostInfo['id']; ?>");
                return nRow;
            },
            "aoColumns": [{"bSearchable": false, "bVisible": false}, null, null, null, null, null, null],

            "fnDrawCallback": function() {
                $( oTableDisk.fnGetNodes() ).click( function () {
                    enableEditable(oTableDisk);
                } );
            }

        });

После переписывания контроллера и модели для поддержки запросов с ограничением, где и в порядке аргументов я получаю данные обратно, и это похоже на мойОбъект JSON правильно отформатирован.Проблема в том, что теперь у меня нет функции разбиения на страницы.или сортировка функциональности.В таблице показаны стрелки нумерации страниц в виде серого, и нажатие на заголовки столбцов на самом деле ничего не делает.Над нумерацией страниц указывается «Показано от 1 до 30 из 30 записей (отфильтровано из 483 записей)», что является правильным для запроса.

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

1 Ответ

2 голосов
/ 08 марта 2012

Ваш сервер просто не отправляет обратно правильные значения для необходимых параметров на стороне сервера:

http://datatables.net/usage/server-side

Я готов за одиннадцать долларов, что он здесь:

iTotalRecords - абсолютное общее количество записей. Вы, вероятно, установили правильное значение здесь.

iTotalDisplayRecords - общее количество записей после серверной стороны фильтрация . Это НЕ просто количество записей, отправляемых обратно. Ставка в одиннадцать долларов заключается в том, что вы ставите здесь «30» со своим новым контроллером.

Если вы все еще не уверены в цели этого второго, помните, что есть возможность уменьшить ваш запрос с помощью поиска или других фильтров. Допустим, у меня 500 записей, и в 250 из них есть строка «Foobar». Если я ищу «Foobar» и сервер корректно обрабатывает этот фильтр, он должен сузить мои доступные записи до 250. Тогда серверная сторона фактически будет только отправлять обратно запрошенные записи в соответствии с iDisplayStart и iDisplayLength (что должно быть автоматически обеспеченным DT). В вашем случае сервер отправит обратно 30 записей, которые, по его мнению, уже отправляются правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...