DataTables row.add al índice específico

Estoy reemplazando los artículos de fila así:

var $targetRow = $(entity.row), dataTable = $targetRow.closest('table.dataTable').DataTable(); dataTable.row($targetRow).remove(); dataTable.row.add({ foo: 1 }).draw(); 

Tengo lógica en la rowCreated vinculada a la tabla, así que estoy recreando la fila para hacer uso de ella. Esto funciona bien Pero row.add siempre agrega la última fila regenerada en la lista. ¿Hay alguna forma de insertarlo en un índice específico?

dataTables mantiene sus filas en una matriz indexada, y no hay métodos API para agregar una nueva fila en un índice específico o cambiar el index() de una fila.

Eso realmente tiene sentido, ya que una tabla de datos típica siempre se ordena, ordena o filtra en datos, no en el índice estático. Y cuando recibe datos de un servidor, o quiere pasar datos a un servidor, nunca usa el index() cliente estático index() tampoco.

Pero si lo piensas bien, aún puedes reordenar filas y con eso insertar una fila en un índice específico muy fácil por código, simplemente reordenando los datos. Cuando se agrega una nueva fila, intercambie los datos de la última fila (la fila insertada) a la segunda última fila, luego cambie los datos de la segunda última fila a la tercera última fila y así sucesivamente, hasta que llegue al índice donde desea para insertar la fila.

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

Ejemplo, insertando una nueva fila en el índice donde se hace clic con el mouse:

 $("#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); }); 

demo -> http://jsfiddle.net/mLh08nyg/

Otra forma es insertar la fila y luego mover la fila en la matriz de filas de DataTable a una posición que especifique antes de volver a dibujar la tabla:

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