感谢 David Konrad 在他的 answer on another question 中就如何在表格中间添加一行提供指导。
我做的第一件事是在我的表中创建一个Action 列并动态添加Up 或Down 选项。
{
name: 'action',
data: null,
title: 'Action',
searchable: false,
sortable: false,
render: function (data, type, full, meta) {
if (type === 'display') {
var $span = $('<span></span>');
if (meta.row > 0) {
$('<a class="dtMoveUp">Up</a>').appendTo($span);
}
$('<a class="dtMoveDown">Down</a>').appendTo($span);
return $span.html();
}
return data;
}
}
然后,我在drawCallback 中添加代码以移除最后一行的Down 箭头并将点击事件绑定到moveUp 和moveDown 函数:
'drawCallback': function (settings) {
$('#ArgumentsTable tr:last .dtMoveDown').remove();
// Remove previous binding before adding it
$('.dtMoveUp').unbind('click');
$('.dtMoveDown').unbind('click');
// Bind click to function
$('.dtMoveUp').click(moveUp);
$('.dtMoveDown').click(moveDown);
}
然后我编写了上移/下移功能。需要注意的是,我的数据有一个 order 属性,我用它来更改顺序。此order 显示为第一列并使其成为默认排序列:
// Move the row up
function moveUp() {
var tr = $(this).parents('tr');
moveRow(tr, 'up');
}
// Move the row down
function moveDown() {
var tr = $(this).parents('tr');
moveRow(tr, 'down');
}
// Move up or down (depending...)
function moveRow(row, direction) {
var index = table.row(row).index();
var order = -1;
if (direction === 'down') {
order = 1;
}
var data1 = table.row(index).data();
data1.order += order;
var data2 = table.row(index + order).data();
data2.order += -order;
table.row(index).data(data2);
table.row(index + order).data(data1);
table.page(0).draw(false);
}
注意:重要的是要了解,当您再次请求DataTable draw()您的表时,它将使用您的数据根据DataTable 定义中设置的参数对结果进行排序。这就是为什么我在本示例中选择将order 设置为第一列(默认排序)并直接更改我的数据对象(而不是使用来自DataTable 的内部信息)。这让事情变得容易多了。
注意 2:真的重要的是,您的数据由已经按 order 排序的 DataTable 接收。否则,此解决方案将无法正常工作。
您可以在此处查看完整的工作示例:
https://jsfiddle.net/kxfx489y/4/