Как перезагрузить / обновить jQuery dataTable?


88

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

Вот что у меня есть:

$(document).ready(function() {
    $("#my-button").click(function() {
        $("#my-datatable").dataTable().fnReloadAjax();
    });
});

Но когда я запускаю это, он ничего не делает. Как правильно обновлять dataTable при нажатии кнопки? Заранее спасибо!


У вас есть ошибки Javascript? Проверьте с помощью Firebug / Chrome Inspector, возможно, добавьте еще код (код таблицы и кнопки, например)
Герт

Ответы:


32

Вы можете попробовать следующее:

function InitOverviewDataTable() {
    oOverviewTable = $('#HelpdeskOverview').dataTable({
        "bPaginate": true,
        "bJQueryUI": true, // ThemeRoller-stöd
        "bLengthChange": false,
        "bFilter": false,
        "bSort": false,
        "bInfo": true,
        "bAutoWidth": true,
        "bProcessing": true,
        "iDisplayLength": 10,
        "sAjaxSource": '/Helpdesk/ActiveCases/noacceptancetest'
    });
}

function RefreshTable(tableId, urlData) {
    $.getJSON(urlData, null, function(json) {
        table = $(tableId).dataTable();
        oSettings = table.fnSettings();

        table.fnClearTable(this);

        for (var i = 0; i < json.aaData.length; i++) {
            table.oApi._fnAddData(oSettings, json.aaData[i]);
        }

        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
        table.fnDraw();
    });
}
// Edited by Prasad
function AutoReload() {
    RefreshTable('#HelpdeskOverview', '/Helpdesk/ActiveCases/noacceptancetest');

    setTimeout(function() {
        AutoReload();
    }, 30000);
}

$(document).ready(function() {
    InitOverviewDataTable();
    setTimeout(function() {
        AutoReload();
    }, 30000);
});

http://www.meadow.se/wordpress/?p=536


Это круто! Но я обнаружил, что вы вызываете _fnAddDataтолько частную функцию. Это рискованно? Допустим, в будущем подпись функции может быть изменена.
Рой Линг

134

В версии 1.10.0 DataTables это легко и просто:

var table = $('#example').DataTable();
table.ajax.reload();

или просто

$('#example').DataTable().ajax.reload();

http://datatables.net/reference/api/ajax.reload ()


20
Будьте осторожны и используйте, $('#example').DataTable()а не $('#example').dataTable().
Серджиу

После этого я не могу получить доступ к содержимому таблицы данных. Затем он говорит, что у меня только 2 TR (один с заголовками, а другой только с одной ячейкой, на которой нет данных). Надо ли сначала его перерисовать?
Jon Koeter

Джон Кутер: невозможно ответить на ваш вопрос, не увидев вашего кода. Отправьте новый вопрос вместе со своим кодом, чтобы можно было воспроизвести проблему.
Атмелино

Это может вызвать ошибку cannot reinitialise datatable jquery. Это происходит потому, что tableинициализируется снова и снова для каждой записи таблицы. Чтобы избежать этого, убедитесь, что вы инициализировали table только один раз.
Shubham A.

4
Для сохранения информации о подкачке используйте. table.ajax.reload (null, false), как указано в официальной документации здесь datatables.net/reference/api/ajax.reload ()
Шринивас Ратикринди

27

Вы можете использовать обширный API DataTable, чтобы перезагрузить его, ajax.reload()

Если вы объявляете свой datatable как DataTable()(новая версия), вам необходимо:

var oTable = $('#filtertable_data').DataTable( );
// to reload
oTable.ajax.reload();

Если вы объявляете свой datatable как dataTable()(старая версия), вам нужно:

var oTable = $('#filtertable_data').dataTable( );
// to reload
oTable.api().ajax.reload();

27

Сначала уничтожьте datatable, а затем нарисуйте datatable.

$('#table1').DataTable().destroy();
$('#table1').find('tbody').append("<tr><td><value1></td><td><value1></td></tr>");
$('#table1').DataTable().draw();

Почему все так сложно?
Акмал

Спасибо. Это единственный ответ, который действительно работает.
Керин,

24

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

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

var refreshedDataFromTheServer = getDataFromServer();

var myTable = $('#tableId').DataTable();
myTable.clear().rows.add(refreshedDataFromTheServer).draw();

вот источник: https://datatables.net/reference/api/clear ()


1
Наконец-то ответ без ajax!
Фабио Вентури Пастор

это fnServerData: getDataFromServer?
ДЕРЕК ЛИ

Единственный ответ, который сработал для меня, используя простой объект JS в качестве данных. Благодарность!
Banzy

13
var ref = $('#example').DataTable();
ref.ajax.reload();

Если вы хотите добавить кнопку перезагрузки / обновления в DataTables 1.10, используйте drawCallback .

См. Пример ниже (я использую DataTables с bootstrap css)

var ref= $('#hldy_tbl').DataTable({
        "responsive": true,
        "processing":true,
        "serverSide":true,
        "ajax":{
            "url":"get_hotels.php",
            "type":"POST"
        },
        "drawCallback": function( settings ) {
            $('<li><a onclick="refresh_tab()" class="fa fa-refresh"></a></li>').prependTo('div.dataTables_paginate ul.pagination');
        }
    });

function refresh_tab(){
    ref.ajax.reload();
}


10

я бы рекомендовал использовать следующий код.

table.ajax.reload(null, false); 

Причина этого - пейджинг пользователя не будет сброшен при перезагрузке.
Пример:

<button id='refresh'> Refresh </button>

<script>
    $(document).ready(function() {

        table = $("#my-datatable").DataTable();
        $("#refresh").on("click", function () { 
         table.ajax.reload(null, false); 
        });

   });
</script>

подробности об этом можно найти здесь


Правильный. Чтобы не менять номер страницы после обновления таблицы
Мантан Патель

равноtable.ajax.reload();
CodeToLife

Да, это то же самое, что и выше, но вы упускаете суть. table.ajax.reload (); обновит и сбросит таблицу, если вы находитесь на 5 странице и обновите ее. это вернет вас на первую страницу.
Ад Кан

3

Вот как я это делаю ... Может, не лучший способ, но определенно проще (ИМХО) и не требует дополнительных плагинов.

HTML

<div id="my-datatable"></div>

jQuery

function LoadData() {
    var myDataTable = $("#my-datatable").html("<table><thead></thead><tbody></tbody></table>");
    $("table",myDataTable).dataTable({...});
}
$(document).ready(function() {
    $("#my-button").click(LoadData);
    LoadData();
});

Примечание. В моей работе с jQuery dataTable иногда, если у вас его нет, <thead></thead><tbody></tbody>он не работает. Но вы могли бы обойтись и без этого. Я не совсем понял, что делает это необходимым, а что нет.


3

Сначала попробуйте уничтожить datatable, затем настройте его снова, например

var table;
$(document).ready(function() {
    table = $("#my-datatable").datatable()
    $("#my-button").click(function() {
        table.fnDestroy();
        table = $("#my-datatable").dataTable();
    });
});


3

Используйте этот код, если хотите обновить свою таблицу данных:

 $("#my-button").click(function() {
    $('#my-datatable').DataTable().clear().draw();
 });

2

ну, вы не показали, как / где вы загружаете скрипты, но чтобы использовать функции API плагина, вы должны включить его на свою страницу после загрузки библиотеки DataTables, но до инициализации DataTable.

как это

<script type="text/javascript" src="jquery.dataTables.js"></script>
<script type="text/javascript" src="dataTables.fnReloadAjax.js"></script>

1

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

HTML

<table id="HelpdeskOverview">
  <thead>
    <tr>
      <th>Ärende</th>
      <th>Rapporterad</th>
      <th>Syst/Utr/Appl</th>
      <th>Prio</th>
      <th>Rubrik</th>
      <th>Status</th>
      <th>Ägare</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>

Javascript

function InitOverviewDataTable()
{
  oOverviewTable =$('#HelpdeskOverview').dataTable(
  {
    "bPaginate": true,
    "bJQueryUI": true,  // ThemeRoller-stöd
    "bLengthChange": false,
    "bFilter": false,
    "bSort": false,
    "bInfo": true,
    "bAutoWidth": true,
    "bProcessing": true,
    "iDisplayLength": 10,
    "sAjaxSource": '/Helpdesk/ActiveCases/noacceptancetest'
  });
}

function RefreshTable(tableId, urlData)
{
  $.getJSON(urlData, null, function( json )
  {
    table = $(tableId).dataTable();
    oSettings = table.fnSettings();

    table.fnClearTable(this);

    for (var i=0; i<json.aaData.length; i++)
    {
      table.oApi._fnAddData(oSettings, json.aaData[i]);
    }

    oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    table.fnDraw();
  });
}

function AutoReload()
{
  RefreshTable('#HelpdeskOverview', '/Helpdesk/ActiveCases/noacceptancetest');

  setTimeout(function(){AutoReload();}, 30000);
}

$(document).ready(function () {
  InitOverviewDataTable();
  setTimeout(function(){AutoReload();}, 30000);
});

Источник


1

var myTable = $ ('# tblIdName'). DataTable (); myTable.clear (). rows.add (myTable.data) .draw ();

Это сработало для меня без использования ajax.


0
        if(data.length==0){
            alert("empty");
              $('#MembershipTable > tbody').empty();
            // $('#MembershipTable').dataTable().fnDestroy();
                    $('#MembershipTable_info').empty(); 
                    $("#MembershipTable_length").empty();
                    $("#MembershipTable_paginate").empty();

             html="<tr><td colspan='20'><b>No data available in Table</b> </td></tr>";
           $("#MembershipTable").append(html);
        }

        else{
             $('#MembershipTable').dataTable().fnDestroy();
            $('#MembershipTable > tbody').empty();

         for(var i=0; i<data.length; i++){
            //

.......}


0

Согласно справке DataTable , я мог сделать для своей таблицы.

Я хочу, чтобы в свой DataTable было несколько баз данных.

Например: data_1.json> 2500 записей - data_2.json> 300 записей - data_3.json> 10265 записей

var table;
var isTableCreated= false;

if (isTableCreated==true) {
    table.destroy();
    $('#Table').empty(); // empty in case the columns change
}
else
    i++;

table = $('#Table').DataTable({
        "processing": true,
        "serverSide": true,
        "ordering": false,
        "searching": false,
        "ajax": {
            "url": 'url',
            "type": "POST",
            "draw": 1,
            "data": function (data) {
                data.pageNumber = (data.start / data.length);
            },
            "dataFilter": function (data) {
                return JSON.stringify(data);
            },
            "dataSrc": function (data) {
                if (data.length > 0) {
                    data.recordsTotal = data[0].result_count;
                    data.recordsFiltered = data[0].result_count;
                    return data;
                }
                else
                    return "";
            },

            "error": function (xhr, error, thrown) {
                alert(thrown.message)
            }
        },
        columns: [
           { data: 'column_1' },
           { data: 'column_2' },
           { data: 'column_3' },
           { data: 'column_4' },
           { data: 'column_5' }
        ]
    });

0

если вы используете datatable v1.10.12, тогда просто вызывайте .draw()метод и передавайте требуемые типы рисования full-reset, pageто есть вы повторно нарисуете свой dt с новыми данными

let dt = $("#my-datatable").datatable()

// делаем какое-то действие

dt.draw('full-reset')

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


0

Я сделал кое-что, что связано с этим ... Ниже приведен образец javascript с тем, что вам нужно. Здесь есть демонстрация: http://codersfolder.com/2016/07/crud-with-php-mysqli-bootstrap-datatables-jquery-plugin/

//global the manage member table 
var manageMemberTable;

function updateMember(id = null) {
    if(id) {
        // click on update button
        $("#updatebutton").unbind('click').bind('click', function() {
            $.ajax({
                url: 'webdesign_action/update.php',
                type: 'post',
                data: {member_id : id},
                dataType: 'json',
                success:function(response) {
                    if(response.success == true) {                      
                        $(".removeMessages").html('<div class="alert alert-success alert-dismissible" role="alert">'+
                              '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+
                              '<strong> <span class="glyphicon glyphicon-ok-sign"></span> </strong>'+response.messages+
                            '</div>');

                        // refresh the table

                        manageMemberTable.ajax.reload();

                        // close the modal
                        $("#updateModal").modal('hide');

                    } else {
                        $(".removeMessages").html('<div class="alert alert-warning alert-dismissible" role="alert">'+
                              '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+
                              '<strong> <span class="glyphicon glyphicon-exclamation-sign"></span> </strong>'+response.messages+
                            '</div>');

                        // refresh the table                        
                        manageMemberTable.ajax.reload();

                        // close the modal
                        $("#updateModal").modal('hide');
                    }
                }
            });
        }); // click remove btn
    } else {
        alert('Error: Refresh the page again');
    }
}

0

вы должны написать эту строку кода после выполнения операции обновления.

$('#example').DataTable().ajax.reload();



-2
    function autoRefresh(){
        table.ajax.reload(null,false); 
        alert('Refresh');//for test, uncomment
    }

    setInterval('autoRefresh()', 5000); 

-6

повторно инициализировать данные с помощью init и записать, получить как истинные .. сделано..так просто

например.

TableAjax.init();
retrieve: true,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.