【问题标题】:Appending Rows to a DataTables Grid将行附加到 DataTables 网格
【发布时间】:2018-07-06 09:12:29
【问题描述】:

我正在尝试将 <tr/> 标签动态添加到 DataTable,但我没有找到关于“添加 TR 过程”应该如何工作的真正好的文档。我有这个作为我的 DataTables 设置:

$("#Grid").DataTable({
   stateSave: true,
   fixedHeader: true,
   rowReorder: true,
   .
   .
   columnDefs: [
      { orderable: false, className: "seq-cell", targets: 0 },
      { orderable: false, targets: "_all" }
   ]
})
.on("row-reordered", function (e, diff, edit) {
   for (var i = 0; i < diff.length; i++)
   {
       ..
   }
});

我通过 jQuery AJAX 语句从 MVC 操作方法获取网格中项目的定义作为 HTML 字符串:

$.ajax({
    type: "post",
    url: "AddItem",
    data: $("#newitemform").find(":input[name]").serialize(),
    success: function (d) {
       var $body = $("#Grid tbody");
       $body.append(d);
    }
});

“d”参数是一行的 HTML;我把它附加到身体上。这会正确添加,但没有启用行重新排序功能。追加到 DataTable,然后重新启用任何功能的正确方法是什么?

【问题讨论】:

  • ajax 中返回的行的 html 是否不同?还是只是该 html 中的数据有所不同?
  • 返回的 HTML 如果始终是 TR 元素但仅因数据而异,而不是语法...

标签: javascript jquery ajax datatables


【解决方案1】:

使用row.add() API 方法添加新行而不是追加到表体。

如果d 包含以下格式的字符串&lt;tr&gt;...&lt;/tr&gt;,您可以使用$("#Grid").DataTable().row.add($(d).get(0)) 添加新行。

例如:

$.ajax({
    type: "post",
    url: "AddItem",
    data: $("#newitemform").find(":input[name]").serialize(),
    success: function (d) {
       $("#Grid").DataTable().row.add($(d).get(0)).draw();
    }
});

有关代码和演示,请参阅 this example

【讨论】:

    【解决方案2】:

    最好的选择是使用 Datatables API 向表中添加行。如上一个回复所示,您可以使用row.add()rows.add()。数据需要位于与您的 Datatables 数据结构配置相匹配的数据结构中,即数组或对象。

    但是,您似乎正在接收 HTML 结构化数据并直接附加到表格中。在这种情况下,Datatables 不知道添加的数据。您将需要销毁 (destroy()) Datatables 表,附加您的数据,然后重新初始化 Datatables。例如:

    $.ajax({
        type: "post",
        url: "AddItem",
        data: $("#newitemform").find(":input[name]").serialize(),
        success: function (d) {
           $("#Grid").DataTable().destroy();
           var $body = $("#Grid tbody");
           $body.append(d);
    
           $("#Grid").DataTable({
           stateSave: true,
           fixedHeader: true,
           rowReorder: true,
           .
           .
           columnDefs: [
              { orderable: false, className: "seq-cell", targets: 0 },
              { orderable: false, targets: "_all" }
           ]
        })
    
        }
    });
    

    【讨论】:

    • 不需要销毁表,row.add() API 方法接受tr 节点作为参数。
    • @Gyrocode.com 是的,我能够使用它取得一些成功(这个叉子说明这是通过:jsfiddle.net/52tmwkgr/1 工作的)但是由于某种原因,在我的确切情况下它仍然无法正常工作这真的很奇怪......所以这个方法现在解决了它。
    • @BrianMains,我忘了链接draw() 方法,请参阅updated example 它的工作原理。我仍然认为没有必要destroy() 表。也更新了my answer
    • 正如@Gyrocode.com 提到的,不需要destroy() 方法。如果您的数据结构与表结构匹配,他的示例应该可以正常工作。直到现在,我才意识到row.add() 将以&lt;tr&gt;...&lt;/tr&gt; 格式附加数据。很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多