DataTables row.add 到特定索引

DataTables row.add to specific index

我正在像这样替换行项目:

var $targetRow = $(entity.row),
    dataTable = $targetRow.closest('table.dataTable').DataTable();

dataTable.row($targetRow).remove();

dataTable.row.add({ foo: 1 }).draw();

我在绑定到 table 的 rowCreated 回调中有逻辑,因此我正在重新创建该行以使用它。这很好用。但是 row.add 总是将重新生成的行添加到列表的最后。有什么方法可以将它插入到特定索引中吗?

dataTables 将其行保存在索引数组中,并且没有 API 方法用于在特定索引处添加新行或更改行的 index()

这实际上很有意义,因为典型的 dataTable 总是根据数据而不是静态索引进行排序/排序或过滤。当您从服务器接收数据,或者想将数据传递给服务器时,您也永远不会使用静态客户端 index()

但如果您考虑一下,您仍然可以重新排序行,然后通过代码非常容易地在特定索引处插入一行,只需重新排序数据即可。添加新行时,将最后一行(插入的行)的数据交换到倒数第二行,然后将倒数第二行的数据交换到倒数第三行,依此类推,直到到达所需的索引插入行。

[0][1][2][3][4->][<-newRow]
[0][1][2][3->][<-newRow][4]
[0][1][2->][<-newRow][3][4]

示例,在单击鼠标的索引处插入新行:

$("#example").on('click', 'tbody tr', function() {
    var currentPage = table.page();

    //insert a test row
    count++;
    table.row.add([count, count, count, count, count]).draw();

    //move added row to desired index (here the row we clicked on)
    var index = table.row(this).index(),
        rowCount = table.data().length-1,
        insertedRow = table.row(rowCount).data(),
        tempRow;

    for (var i=rowCount;i>index;i--) {
        tempRow = table.row(i-1).data();
        table.row(i).data(tempRow);
        table.row(i-1).data(insertedRow);
    }     
    //refresh the current page
    table.page(currentPage).draw(false);
});  

演示 -> http://jsfiddle.net/mLh08nyg/

另一种方法是插入行,然后在重绘Table:

之前将数据Table行数组中的行移动到您指定的位置
// Define the row to insert (using your method of choice)
var rowInsert = $('#table-id').find('tr:last');
// Get table reference - note: dataTable() not DataTable()
var table = $('#table-id').dataTable();
// Get api
var dt = table.api();
// Insert row (inserted as the last element in aiDisplayMaster array)
dt.row.add(rowInsert);
// Get the array holding the rows
var aiDisplayMaster = table.fnSettings()['aiDisplayMaster'];
// Remove the last element in the array
var moveRow = aiDisplayMaster.pop();
// EITHER add row to the beginning of the array (uncomment)
//aiDisplayMaster.unshift(moveRow);
// OR add row to a specific index (in this case to index 3)
var index = 3;
aiDisplayMaster.splice(index, 0, moveRow);
// Redraw Table
dt.draw(false);