Como recarregar / atualizar o jQuery dataTable?

88

Estou tentando implementar a funcionalidade pela qual clicar em um botão na tela fará com que minha dataTable jQuery seja atualizada (pois a fonte de dados do lado do servidor pode ter mudado desde que a dataTable foi criada).

Aqui está o que eu tenho:

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

Mas quando eu executo isso, não faz nada. Qual é a maneira correta de atualizar a dataTable quando o botão é clicado? Desde já, obrigado!

IAmYourFaja
fonte
Você está recebendo algum erro de Javascript? Verifique com o Firebug / Chrome Inspector, talvez adicione mais algum código (código de tabela e botão, por exemplo)
Geert

Respostas:

31

Você pode tentar o seguinte:

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

Xavier
fonte
Isso é ótimo! Mas descobri que você está chamando o _fnAddData, o que deve ser apenas uma função privada. Isso é arriscado? Digamos que no futuro a assinatura da função possa ser alterada.
Roy Ling
134

Com a versão 1.10.0 do DataTables, é integrado e fácil:

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

ou apenas

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

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

Atmelino
fonte
20
Tenha cuidado e use $('#example').DataTable()e não $('#example').dataTable().
Sergiu
Depois de fazer isso, não consigo acessar o conteúdo da tabela de dados. Em seguida, diz que tenho apenas 2 TRs (um com os cabeçalhos e outro com apenas 1 célula exibindo que não há dados). Tenho que redesenhar primeiro?
Jon Koeter
Jon Koeter: impossível responder sua pergunta sem ver seu código. Poste como uma nova pergunta junto com seu código para permitir a reprodução do problema.
atmelino de
Isso pode gerar um erro cannot reinitialise datatable jquery. Isso acontece porque tablefoi inicializado repetidamente para cada entrada da tabela. Para evitar isso, certifique-se de inicializar table apenas uma vez.
Shubham A.
4
Para preservar o uso das informações de paginação. table.ajax.reload (null, false), conforme mencionado na documentação oficial aqui datatables.net/reference/api/ajax.reload ()
Srinivas Rathikrindi
27

Você pode usar uma extensa API de DataTable para recarregá-lo ajax.reload()

Se você declarar sua tabela de dados como DataTable()(nova versão), você precisa:

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

Se você declarar sua tabela de dados como dataTable()(versão antiga), você precisa:

var oTable = $('#filtertable_data').dataTable( );
// to reload
oTable.api().ajax.reload();
Sruit A.Suk
fonte
27

Destrua a tabela de dados primeiro e, em seguida, desenhe a tabela de dados.

$('#table1').DataTable().destroy();
$('#table1').find('tbody').append("<tr><td><value1></td><td><value1></td></tr>");
$('#table1').DataTable().draw();
Sareesh Krishnan
fonte
Por que as coisas são tão complicadas?
Akmal
Obrigado. Esta é a única resposta aqui que realmente funciona.
Cerin
24

Eu tive o mesmo problema, foi assim que resolvi:

primeiro pegue os dados com o método de sua escolha, eu uso ajax após enviar os resultados que farão alterações na tabela. Em seguida, limpe e adicione novos dados:

var refreshedDataFromTheServer = getDataFromServer();

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

aqui está a fonte: https://datatables.net/reference/api/clear ()

Mosd
fonte
1
Finalmente uma resposta não Ajax!
Fabio Venturi Pastor
isso é fnServerData: getDataFromServer?
DEREK LEE
A única resposta que funcionou para mim foi usar um objeto JS simples como dados. Obrigado!
Banzy,
13
var ref = $('#example').DataTable();
ref.ajax.reload();

Se você deseja adicionar um botão recarregar / atualizar ao DataTables 1.10, use drawCallback .

Veja o exemplo abaixo (estou usando DataTables com 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();
}
Vibin TV
fonte
10

eu recomendaria usar o código a seguir.

table.ajax.reload(null, false); 

A razão para isso, a paginação do usuário não será redefinida na recarga.
Exemplo:

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

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

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

   });
</script>

detalhes sobre isso podem ser encontrados aqui

Ad Kahn
fonte
O certo. Para não alterar o número da página após a atualização da tabela
Manthan Patel
igual atable.ajax.reload();
CodeToLife
Sim, é igual ao anterior, mas você está perdendo o ponto. table.ajax.reload (); irá atualizar e redefinir a tabela, se você estiver na página 5 e atualizá-la. isso o levará de volta à primeira página.
Ad Kahn de
3

É assim que eu faço ... Talvez não seja a melhor maneira, mas é definitivamente mais simples (IMHO) e não requer plug-ins adicionais.

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();
});

Nota: Em meu trabalho com jQuery dataTable, às vezes, se você não tiver, <thead></thead><tbody></tbody>ele não funciona. Mas você pode sobreviver sem ele. Eu não descobri exatamente o que o torna obrigatório e o que não é.

Drew Chapin
fonte
3

Tente destruir a tabela de dados primeiro e depois configure-a novamente, exemplo

var table;
$(document).ready(function() {
    table = $("#my-datatable").datatable()
    $("#my-button").click(function() {
        table.fnDestroy();
        table = $("#my-datatable").dataTable();
    });
});
Hoàng Nghĩa
fonte
3

Se você usar o atributo url, basta fazer

table.ajax.reload()

Espera que ajude alguém

Herman Demsong
fonte
3

Use este código, quando quiser atualizar sua tabela de dados:

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

bem, você não mostrou como / onde está carregando os scripts, mas para usar as funções da API do plug-in, você deve incluí-lo em sua página depois de carregar a biblioteca DataTables, mas antes de inicializar a DataTable.

como isso

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

O DataTables de Allan Jardine é um plugin jQuery muito poderoso e inteligente para exibir dados tabulares. Ele tem muitos recursos e pode fazer quase tudo o que você deseja. Porém, uma coisa que é curiosamente difícil é como atualizar o conteúdo de uma maneira simples, então, para minha própria referência e, possivelmente, para o benefício de outros, aqui está um exemplo completo de uma maneira de fazer isso:

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);
});

Fonte

Michel Ayres
fonte
1

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

Isso funcionou para mim sem usar ajax.

T-Jayanth Dore
fonte
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
fonte
0

De acordo com a ajuda do DataTable , eu poderia fazer para minha mesa.

Eu quero vários bancos de dados para meu DataTable.

Por exemplo: data_1.json> 2500 registros - data_2.json> 300 registros - data_3.json> 10265 registros

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' }
        ]
    });
Comunidade
fonte
0

se estiver usando a tabela de dados v1.10.12, basta chamar o .draw()método e passar seus tipos de desenho necessários full-reset, ou seja , pagevocê vai redesenhar seu dt com novos dados

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

// faça alguma ação

dt.draw('full-reset')

para mais, verifique a documentação datável

Jimmy Obonyo Abor
fonte
0

Eu tinha feito algo relacionado a isso ... Abaixo está um exemplo de javascript com o que você precisa. Há uma demonstração sobre isso aqui: 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');
    }
}
Mwangi Thiga
fonte
0

você deve escrever esta linha de código após fazer a operação de atualização.

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

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

    setInterval('autoRefresh()', 5000); 
user8108068
fonte
-6

reinicializar tabela de dados com init e escrever recuperar como verdadeiro ..done..so simples

por exemplo.

TableAjax.init();
retrieve: true,
Rana viral
fonte