2015-06-08 53 views
1

我更換行項目是這樣的:數據表row.add具體指標

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

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

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

我有邏輯的rowCreated回調綁定表,因此我重新創建行利用它。這工作正常。但row.add總是在列表中最後添加重新生成的行。有什麼辦法將它插入到特定的索引中?

+0

http://stackoverflow.com/questions/391314/jquery-insertat – AmmarCSE

+0

一些洞察到這樣的問題:[http://datatables.net/forums/discussion/660/how-to-add-a-row-at -a-specific-index/p1](http://datatables.net/forums/discussion/660/how-to-add-a-row-at-a-specific-index/p1)以及一個並非如此 - 漂亮的解決方法:[http://stackoverflow.com/questions/22387948/add-a-row-after-the-selected-row-in-jquery-datatables](http://stackoverflow.com/questions/22387948/add -a-row-selected-row-in-jquery-datatables) – lshettyl

+0

@AmmarCSE我不認爲使用jQuery來操縱數據表html是最好的選擇。它需要跟蹤行...或者我錯了嗎? – filur

回答

8

數據表保持在索引數組其行,並且存在用於在特定的索引添加新行或改變行的index()沒有API方法。

這實際上是有道理的,因爲一個典型的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/

+1

它工作的很棒:) –

+1

不錯!英鎊工作。 – AntDC

2

另一種方法是插入行,然後移動該行的數據表中的行數組中你重繪表之前指定的位置:

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