使用ajax刷新表格内容后重绘数据表?

Posted

技术标签:

【中文标题】使用ajax刷新表格内容后重绘数据表?【英文标题】:Redraw datatables after using ajax to refresh the table content? 【发布时间】:2011-12-10 18:24:51 【问题描述】:

我正在使用Datatables 并在页面上有一个使用 AJAX 刷新表格的按钮。为了清楚表没有使用 ajax 数据源,我们只是在需要时才使用 ajax 来刷新它。 Ajax 正在刷新包含表格的 div。我知道我正在失去分页按钮和过滤功能,因为表格需要重新绘制,但我不确定如何将其添加到表格初始化代码中。

数据表代码

var oTable6;
$(document).ready(function() 
    oTable6 = $('#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
        ]

    );
);

ajax代码是这样的

$("#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);
        );
);

我试过了,但是没用

"fnDrawCallback": function() 
    function( data )  
        $("#ajaxresponse").html(data);
    ;
,

【问题讨论】:

您能否发布您的完整数据表代码以及与之相关的 html? 我已经更新了上面的代码以显示表格的整个初始化 @agunn 为什么不链接到该问题的所选答案而不是您自己的答案?该问题的选择答案是***.com/a/7890909/804087 注意:对于现代数据表 api(v1.10 及更高版本)的用户,我在下面(***.com/a/40554137/165164)发布了一个使用该变体的答案。 AFAICS,到目前为止,这个问题的所有答案都使用 v1.9 和之前的 api 语法。 @anagio,我在下面链接到我的答案,因为我相信在这里有一个指向更新的答案的指针是有用的,它指的是更新的 DT api。我没有提到任何其他 SO 帖子问题/答案,因为我没有找到使用现代 DT 1.10 api 语法的问题/答案。感谢您质疑我是否做出正确选择的权利,但在我看来,您实际上删除了我的评论。我很困惑吗?我不认为删除我的评论,而不是回应它,符合 SO 的精神。 【参考方案1】:

看起来你可以使用 API 函数来

清空表(fnClearTable) 向表中添加新数据 (fnAddData) 重绘表格 (fnDraw)

http://datatables.net/api

更新

我猜你正在使用DOM Data Source(用于服务器端处理)来生成你的表。一开始我并没有真正明白这一点,所以我之前的答案对此不起作用。

在不重写服务器端代码的情况下让它工作:

您需要做的是完全删除旧表(在 dom 中)并将其替换为 ajax 结果内容,然后重新初始化数据表:

// 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
        ]

     
    );

【讨论】:

我一直在尝试使用所有这三个方法,但没有成功。我可以在我看到旧数据清除的 ajax 函数之前调用 clearTable。然后我在 ajax 函数之后有 fnDraw 并且它没有重绘表格。 ajax 响应包括其他 html 而不仅仅是 所以我确定我需要专门重绘 #rankings 表 在我看来 fnAddData 函数接受的是数据数组,而不是 HTML那么有没有在不重新编码 ajax 以获取数组的情况下刷新我的表?
【参考方案2】:

尝试像这样使用 bDestroy:true 销毁数据表:

$("#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 将首先销毁与该选择器关联的数据表实例,然后再重新初始化一个新实例。

【讨论】:

抱歉,有一个菜鸟问题,但您是如何在表格中填写新数据的?这是$("#ajaxresponse").html(data);吗? 这对我有用。我使用 ajax 将我的意大利面条内容放入表中。我将"bDestroy":true, 添加到参数中。之后初始化数据表加载的每个 ajax 内容。 thnx @Keith.Abramo【参考方案3】:

我不知道为什么。但是

oTable6.fnDraw();

为我工作。我把它放在下一行。

【讨论】:

因为 oTable6 是使用 $(element).dataTables() 而不是 DataTables 类启动的。【参考方案4】:

使用这个:

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

var table = $(selector).DataTables();
table.draw(false);

【讨论】:

【参考方案5】:

对于现代 DataTables(1.10 及更高版本)的用户,此页面上的所有答案和示例均针对旧 api,而不是新 api。我很难找到一个更新的例子,但最终还是找到了this DT forum post(TL;对于大多数人来说是DR),这让我找到了this concise example。

在我终于注意到 html 字符串周围的 $() 选择器语法后,示例代码对我有用。您必须添加一个节点而不是字符串。

该示例确实值得一看,但是,本着 SO 的精神,如果您只想查看有效的 sn-p 代码:

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

细心的读者可能会注意到,由于我们只添加一行数据,table.row.add(...) 应该也能正常工作,并且对我有用。

【讨论】:

【参考方案6】:

这对我有用

var dataTable = $('#HelpdeskOverview').dataTable();

var oSettings = dataTable.fnSettings();
dataTable.fnClearTable(this);
for (var i=0; i<json.aaData.length; i++)

   dataTable.oApi._fnAddData(oSettings, json.aaData[i]);

oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
dataTable.fnDraw();

【讨论】:

【参考方案7】:

在初始化时使用:

"fnServerData": function ( sSource, aoData, fnCallback ) 
                    //* Add some extra data to the sender *
                    newData = aoData;
                    newData.push( "name": "key", "value": $('#value').val() );

                    $.getJSON( sSource, newData, function (json) 
                        //* Do whatever additional processing you want on the callback, then tell DataTables *
                        fnCallback(json);
                     );
                ,

然后只需使用:

$("#table_id").dataTable().fnDraw();

fnServerData 中重要的是:

    newData = aoData;
    newData.push( "name": "key", "value": $('#value').val() );

如果您直接推送到 aoData,则更改在您第一次绘制表格时是永久性的,并且 fnDraw 不会按您想要的方式工作。

【讨论】:

【参考方案8】:

这就是我用 ajax 检索的数据提供表格的方式(不确定这是否是最佳实践,但感觉直观且效果很好):

/* 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] );
                                    

【讨论】:

【参考方案9】:

检查 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])
    
  );
);

【讨论】:

以上是关于使用ajax刷新表格内容后重绘数据表?的主要内容,如果未能解决你的问题,请参考以下文章

更新数据异步后重绘 UITableView

仅在数据更改时刷新 DataTable

使用来自 django 视图的数据刷新/重绘 jquery 数据表

仅使用 jQuery/Ajax 刷新表的值而不重新加载页面

自定义视图在缩放后重绘时如何防止“反弹”效果?

更改字段后刷新数据表且无 ajax