Как перезагрузить dataTables на ajax и вызвать новые нумерации страниц - PullRequest
0 голосов
/ 09 октября 2018

Прежде всего, я использовал здесь пример javascript, я взял базовый и изменил его самостоятельно.

https://datatables.net/examples/data_sources/server_side

У меня есть пара проблем, с которыми нужноявляются:

  1. После загрузки данных при загрузке страницы он успешно извлекает данные по умолчанию, НО не применяет правильное представление нумерации страниц и длины.Скажем, у меня есть 100 данных по умолчанию, они полностью показаны, а не разрезаны на 10, что является длиной по умолчанию для dataTable.Также при разбивке на страницы он генерирует 1–10 кнопок разбивки на страницы, но он не работает, поскольку все 100 записей уже отображаются на странице 1.
  2. После использования поиска он успешно извлекает правильные данные, НО dataTable не делаетt выводит на него новый набор данных, что противоречит приведенному выше примеру.

Это мой скрипт dataTable:

    $('#invoice-history').DataTable({
        processing: true,
        serverSide: true,
        searchDelay: 1000,
        ajax: {
            url: '/stock-sales/search',
            type: 'POST',
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        },
        columns: [
            { data: 'ss_id' },
            {
                render: function ( data, type, row, meta ) {
                    return  row.patient_last_name + ', ' + row.patient_first_name;
                }
            },
            { data: 'grandtotal_current' },
            { data: 'created_at' },
            {
                render: function ( data, type, row, meta ) {
                    return  '<a href="/reports/invoice/' + row.ss_id + '/print" target="_blank" class="btn btn-primary btn-xs btn-block"><i class="fa fa-print"></i> Print</a>';
                }
            },
            {
                render: function ( data, type, row, meta ) {
                    return  '<a href="/stock-sales/return/' + row.ss_id + '" class="btn btn-danger btn-xs btn-block"><i class="fa fa-undo"></i> Return</a>';
                }
            }
        ],
        columnDefs: [ {
              targets: [ 4, 5 ],
              orderable: false
        } ],
        language: {
            emptyTable: '<center><span class="label label-danger">NO INVOICE RECORDS FOUND</span></center>',
            zeroRecords: '<center><span class="label label-danger">NO MATCHING RECORDS FOUND</span></center>'
        },
        order: [[ 3, 'desc' ]]
    });

На стороне сервера я использую Laravel Framework:

public function search(Request $request)
{
    $transactions = StockSales::getAllByDepartment(Auth::user()->employee->department->id, $request->search['value']);

    return array(
        "draw" => 1,
        "recordsTotal" => count($transactions),
        "recordsFiltered" => count($transactions),
        "data" => $transactions
    );
}

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

РЕДАКТИРОВАТЬ:

фактически сделал поиск перерисовывать данные путем возврата интергера рисования из ajax

public function search(Request $request)
{
    $transactions = StockSales::getAllByDepartment(Auth::user()->employee->department->id, $request->search['value']);

    return array(
        "draw" => $request->draw, //from fixed 1
        "recordsTotal" => count($transactions),
        "recordsFiltered" => count($transactions),
        "data" => $transactions
    );

}

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Попробуйте атрибут "pageLength" в инициализируемой данными инициализации, чтобы указать количество строк на странице.

"pageLength": 10,

Сторона сервера: вам необходимо использовать параметры 'length' и 'start', передаваемыеajax-запрос для разбиения на страницы на стороне сервера.Взгляните на все параметры , используемые таблицами данных при обработке на стороне сервера.

$limit = $request->length;
$start = $request->start;

Таким образом, вы можете точно настроить метод контроллера на что-то вроде:

$transactions = StockSales::getAllByDepartment(Auth::user()->employee->department->id,
        $request->search['value'])
        ->offset($start)
        ->limit($limit);

return array(
    "draw" => $request->draw, //from fixed 1
    "recordsTotal" => count($transactions),
    "recordsFiltered" => count($transactions),
    "data" => $transactions
);
0 голосов
/ 09 октября 2018

Проблема в том, что вы неправильно поняли обработку на стороне сервера serverSide: true Из-за https://datatables.net/examples/data_sources/server_side

При включенной обработке на стороне сервера все действия по поиску, поиску и упорядочению, выполняемые DataTables, передаютсясервер, на котором механизм SQL (или аналогичный) может выполнять эти действия с большим набором данных (в конце концов, для этого и предназначен механизм баз данных!).Таким образом, каждое рисование таблицы приведет к новому запросу Ajax на получение необходимых данных.

В вашем случае вы возвращаете все данные на вызываемом ajax и думаете, что datatable будет обрабатывать нумерацию страниц, упорядочиваядля тебя.Это неправильно, вы должны сделать это самостоятельно на ajax с именем

Однако, 100 записей не велики, и вы можете решить вашу проблему с помощью

    serverSide: false

При таком изменении datatable загрузит вседанные из источника и процесса ajax для вас

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