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

88

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

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

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

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

IAmYourFaja
источник
У вас есть ошибки 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

Если вы используете атрибут url, просто выполните

table.ajax.reload()

Надеюсь, это кому-то поможет

Герман Демсонг
источник
3

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

 $("#my-button").click(function() {
    $('#my-datatable').DataTable().clear().draw();
 });
AdagioDev
источник
2

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

как это

<script type="text/javascript" src="jquery.dataTables.js"></script>
<script type="text/javascript" src="dataTables.fnReloadAjax.js"></script>
RASG
источник
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++){
            //

.......}

user4022380
источник
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); 
user8108068
источник
-6

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

например.

TableAjax.init();
retrieve: true,
Вирусная рана
источник