Resumen

Estoy utilizando la gran datatable jQuery plugin de http://www.datatables.net. En mi script, estoy agregar dinámicamente filas basadas en la activación de un evento utilizando fnAddData. El uso de fnRowCallback, puedo agregar en un único ID de fila. A veces esto falla y no agregar un ID de fila. En una prueba de 46 fila adiciones, generalmente de 6 a 8 filas de no obtener un IDENTIFICADOR de fila.


Añadir Fila de la función

function ps_ins(row)
{
  var rowArray = row.split('|');
  row = rowArray;
  var alarmID = parseInt(row[1],10);

  $('#mimicTable').dataTable().fnAddData([
    alarmID, 'col2', 'col3', 'col4',
    'col5', 'col6', 'col7'
  ]);
}

Se agregan filas a la tabla correctamente. La prueba de que estoy corriendo añade 46 filas, y todos aparecen como se esperaba.


Agregar el ID de fila

Estoy tratando de agregar un IDENTIFICADOR único para cada fila así que puede modificar una fila específica y se refieren a ella en un dataTable de la caché utilizando una combinación de fnGetRows y .el filtro.

Estoy haciendo esto el uso de fnRowCallback durante la etapa de inicialización. Yo he seguido todos los otros ajustes, sólo en caso de que no hay nada allí que pudiera tener un impacto sobre el problema.

  $('#mimicTable').dataTable({
    "sDom": 'lip<"mimicSpacer">f<"numUnAck">rt',
    "sScrollY": "365px",
    "aaSorting": [[4,'desc'],[5,'desc']],
    "iDisplayLength": 15,
    "aLengthMenu": [[15, 50, 100, -1], [15, 50, 100, 'All']],
    "bAutoWidth": false,
    "aoColumns": [
      null,
      { "sWidth": "20%" },
      { "sWidth": "22%" },
      { "sWidth": "9%" },
      { "sWidth": "9%" },
      { "sWidth": "20%" },
      { "sWidth": "20%" }
    ],
    "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull) {
      $(nRow).attr("id",'alarmNum' + aData[0]);
      return nRow;
    }
  });

Un console.log de la tabla de datos de objeto muestra:
jQuery DataTables: ¿Cómo puedo agregar un ID de fila para cada agrega dinámicamente fila?

Como se puede ver, #14 tiene el id de fila y también la correcta rowStripe clase. #15 (y en adelante) no.

Así que, ¿por qué es fnRowCallback no se activa cada vez que se agrega una fila, sólo a veces? Tal vez hay una mejor manera de agregar un ID de fila cuando se agrega una fila?

Es la devolución de llamada definitivamente no se ejecuta? ¿Has probado el registro el valor de nRow dentro de la fnRowCallback función?
Hola Phil, fnRowCallback parece ser llamado varias veces por lo que es difícil obtener sólo 46 filas de salida para ver lo que pasa.
a los usuarios les gusta mirar un jsfiddle si se debe responder a preguntas más complejas (de lo contrario, se lleva mucho tiempo para analizar por ellos y seguir con la siguiente pregunta)
¿cada fila ya no tienen un identificador único – su posición dentro de la matriz?
sí, pero si entiendo las cosas correctamente, tengo que usar .fnGetNodes() y, a continuación,.filter() para obtener la fila con el objeto de actualizar se muestran los datos de la columna. Nota, la fila I necesidad de actualización pueden ser filtrados y / o en una página diferente.

OriginalEl autor psynnott | 2011-11-23

6 Comentarios

  1. 27

    Encontrado la solución:
    http://www.datatables.net/forums/discussion/2119/adding-row-attributes-after-fnadddata/p1

    Para cualquier otra persona que desean una solución rápida, yo lo hice:

    var addId = $('#mimicTable').dataTable().fnAddData([
      alarmID,
      'col2',
      'col3',
      'col4',
      'col5'
    ]);
    
    var theNode = $('#mimicTable').dataTable().fnSettings().aoData[addId[0]].nTr;
    theNode.setAttribute('id','alarmNum' + alarmID);
    ¿qué es addId[0]?
    addId está definido sólo por encima. A partir de la documentación, fnAddData devuelve un array de enteros, en representación de la lista de índices en aoData que se han añadido a la tabla. Como sólo estamos añadiendo una fila, a continuación, devuelve el índice agregado.

    OriginalEl autor psynnott

  2. 4

    Sé que esto es un hilo viejo, pero esto puede ayudar a otros.
    La manera más fácil lo hago para agregar el atributo id del último añadido fila tan pronto como me llamó la tabla de datos de la función fnAddData es:

    $('#table').dataTable().fnAddData( ['col1','col2','col3'] );     
    
    $('#table tr:last').attr('id','col'+row_id);
    si el tamaño de los datos que agrega es mayor que el número de filas que se muestran en una página. esto no va a funcionar.
    Esto es exactamente por eso que me encanta de stackOverflow… gracias!!

    OriginalEl autor user949000

  3. 2

    Probar esto a mí me funcionó muy bien:

    var newRow = oTable.fnAddData( [ etc..]);
    var oSettings = oTable.fnSettings(); 
    var nTr = oSettings.aoData[ newRow[0] ].nTr;
    nTr.id = 'new id';

    OriginalEl autor jamil

  4. 1

    Hay algo inesperado con su código en el jsbin, incluso si parece estar funcionando. Se inicializa con los «navegadores» conjunto de datos. A continuación, se borran. Entonces se crea una nueva tabla con una fila. A continuación, se borran. Entonces se crea una nueva tabla con dos filas. A continuación, se borran. Entonces se crea una nueva tabla con tres filas.

    Tendría que conseguir un mejor sentido de que el código de la muestra y su objetivo final (y por desgracia mi atención se desvía en otra parte ahora mismo), pero usted debe ser consciente de que fnRowCallback DEBE ser la manera de hacer esto, y que hay muchos redundante tabla construcciones de fila y adiciones que se va a afectar el desempeño, así como la flexibilidad con la modificación de la representación en el futuro.

    gracias por tu respuesta, pero echar un vistazo a la respuesta que he publicado. Funciona 🙂 Rendimiento parece estar bien, pero yo voy a hacer más pruebas.
    Han doblado el código actualizado en el jsbin? Me gustaría meter a su alrededor, también. Me podrían ayudar a encontrar cualquier anomalía.

    OriginalEl autor Greg Pettit

  5. 1

    Puede utilizar DT_RowId cuando se agrega una nueva fila, y el uso de objetos en lugar de una matriz, vea a continuación:

     $('#mimicTable').dataTable().fnAddData({
                'DT_RowId': alarmID, 0:'col2', 1:'col3', 2:'col4',
                3:'col5', 4:'col6', 5:'col7'
            });
    Usted siempre debe explicar sus respuestas en lugar de simplemente pegar un bloque de código
    Miró a su alrededor para siempre antes de que vi este fragmento que me ayudó a entender la críptica error estaba recibiendo. Gracias por esto!

    OriginalEl autor gurkov

  6. 0

    Esto funcionó para mí

    var MyUniqueID = "tr123"; //this is the uniqueId.
    var rowIndex = $('#MyDataTable').dataTable().fnAddData([ "column1Data", "column2Data"]);
    var row = $('#MyDataTable').dataTable().fnGetNodes(rowIndex);
    $(row).attr('id', MyUniqueID);

    OriginalEl autor Rolwin C

Dejar respuesta

Please enter your comment!
Please enter your name here