謝謝大衛·康拉德,他從他的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
排序的數據表接收。否則,該解決方案將無法按原樣工作。
你可以在這裏查看完整的工作示例:
https://jsfiddle.net/kxfx489y/4/
你必須做你自己的編碼。這裏是一個例子 - > http:// stackoverflow。com/questions/30712227/datatables-row-add-to-specific-index/30782115#30782115它不完全相同,它在特定位置插入一行,但應該使用相同的技術將行向上或向下移動。 – davidkonrad
謝謝!當我接近解決方案時,我會查看並更新問題。 – Maxime
@davidkonrad我設法讓它在您的答案中得到靈感。我對該答案做了+1,以表示感謝。問題解決了。 :-) – Maxime