Redraw datatables after using ajax to refresh the table content?

前端 未结 9 607
遇见更好的自我
遇见更好的自我 2021-01-30 04:22

I am using Datatables and have a button on the page that refreshes the table using AJAX. To be clear the table isn\'t using an ajax source of data, we are just using ajax to ref

相关标签:
9条回答
  • 2021-01-30 05:00

    This is how I feed my table with data retrieved by ajax (not sure if this is the best practice tough, but it feels intuitive and works well):

    /* initialise table */
    oTable1 = $( '.tables table' ).dataTable
    ( {
        'sPaginationType': 'full_numbers',
        'bLengthChange': false,
        'aaData': [],
        'aoColumns': [{"sTitle": "Tables"}],
        'bAutoWidth': true
    } );
    
    
     /*retrieve data*/
    function getArr( conf_csv_path )
    {
        $.ajax
        ({
            url  : 'my_url'
            success  : function( obj ) 
            {
                update_table( obj );
            }
        });
    }
    
    
    /* build table data */
    function update_table( arr )
    {        
        oTable1.fnClearTable();
        for ( input in arr )
        {
            oTable1.fnAddData( [ arr[input] );
        }                                
    }
    
    0 讨论(0)
  • 2021-01-30 05:00

    check fnAddData: https://legacy.datatables.net/ref

    $(document).ready(function () {
      var table = $('#example').dataTable();
      var url = '/RESTApplicationTest/webresources/entity.person';
      $.get(url, function (data) {
        for (var i = 0; i < data.length; i++) {
          table.fnAddData([data[i].idPerson, data[i].firstname, data[i].lastname, data[i].email, data[i].phone])
        }
      });
    });
    
    0 讨论(0)
  • 2021-01-30 05:01

    It looks as if you could use the API functions to

    • clear the table ( fnClearTable )
    • add new data to the table ( fnAddData)
    • redraw the table ( fnDraw )

    http://datatables.net/api

    UPDATE

    I guess you're using the DOM Data Source (for server-side processing) to generate your table. I didn't really get that at first, so my previous answer won't work for that.

    To get it to work without rewriting your server side code:

    What you'll need to do is totally remove the old table (in the dom) and replace it with the ajax result content, then reinitialize the datatable:

    // in your $.post callback:
    
    function (data) {
    
        // remove the old table
        $("#ajaxresponse").children().remove();
    
        // replace with the new table
        $("#ajaxresponse").html(data);
    
        // reinitialize the datatable
        $('#rankings').dataTable( {
        "sDom":'t<"bottom"filp><"clear">',
        "bAutoWidth": false,
        "sPaginationType": "full_numbers",
            "aoColumns": [ 
            { "bSortable": false, "sWidth": "10px" },
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
            ]
    
        } 
        );
    }
    
    0 讨论(0)
  • 2021-01-30 05:01

    Use this:

    var table = $(selector).dataTables();
    table.api().draw(false);
    

    or

    var table = $(selector).DataTables();
    table.draw(false);
    
    0 讨论(0)
  • 2021-01-30 05:02

    For users of modern DataTables (1.10 and above), all the answers and examples on this page are for the old api, not the new. I had a very hard time finding a newer example but finally did find this DT forum post (TL;DR for most folks) which led me to this concise example.

    The example code worked for me after I finally noticed the $() selector syntax immediately surrounding the html string. You have to add a node not a string.

    That example really is worth looking at but, in the spirit of SO, if you just want to see a snippet of code that works:

    var table = $('#example').DataTable();
      table.rows.add( $(
              '<tr>'+
              '  <td>Tiger Nixon</td>'+
              '  <td>System Architect</td>'+
              '  <td>Edinburgh</td>'+
              '  <td>61</td>'+
              '  <td>2011/04/25</td>'+
              '  <td>$3,120</td>'+
              '</tr>'
      ) ).draw();
    

    The careful reader might note that, since we are adding only one row of data, that table.row.add(...) should work as well and did for me.

    0 讨论(0)
  • 2021-01-30 05:04

    Try destroying the datatable with bDestroy:true like this:

    $("#ajaxchange").click(function(){
        var campaign_id = $("#campaigns_id").val();
        var fromDate = $("#from").val();
        var toDate = $("#to").val();
    
        var url = 'http://domain.com/account/campaign/ajaxrefreshgrid?format=html';
        $.post(url, { campaignId: campaign_id, fromdate: fromDate, todate: toDate},
                function( data ) { 
    
                    $("#ajaxresponse").html(data);
    
                    oTable6 = $('#rankings').dataTable( {"bDestroy":true,
                        "sDom":'t<"bottom"filp><"clear">',
                        "bAutoWidth": false,
                        "sPaginationType": "full_numbers",
    "aoColumns": [ 
            { "bSortable": false, "sWidth": "10px" },
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
            ]
    
    } 
    );
                });
    
    });
    

    bDestroy: true will first destroy and datatable instance associated with that selector before reinitializing a new one.

    0 讨论(0)
提交回复
热议问题