JQuery Datatables: no se puede leer la propiedad 'aDataSort' de undefined


96

Creé este violín y funciona bien según mis requisitos: Fiddle

Sin embargo, cuando uso lo mismo en mi aplicación , aparece un error en la consola del navegador que dice No se puede leer la propiedad 'aDataSort' de indefinido

En mi aplicación, el javascript dice algo parecido a lo siguiente: He comprobado la salida del controlador ... funciona bien y también está impreso en la consola.

$(document).ready(function() {

    $.getJSON("three.htm", function(data) {
             // console.log("loadDataTable >>  "+JSON.stringify(data));
             })
             .fail(function( jqxhr, textStatus, error ) {
             var err = textStatus + ', ' + error;
             alert(err);
             console.log( "Request Failed: " + err);
             })
             .success(function(data){
                 loadDataTable(data);
             });

    function loadDataTable(data){
         $("#recentSubscribers").dataTable().fnDestroy();    
         var oTable = $('#recentSubscribers').dataTable({
             "aaData" : JSON.parse(data.subscribers),
             "processing": true,
            "bPaginate": false,
            "bFilter": false,
            "bSort": false,
            "bInfo": false,
            "aoColumnDefs": [{
            "sTitle": "Subscriber ID",
            "aTargets": [0]
        }, {
            "sTitle": "Install Location",
            "aTargets": [1]
        }, {
            "sTitle": "Subscriber Name",
            "aTargets": [2]
        }, {
            "aTargets": [0], 
            "mRender": function (data, type, full) {
                return '<a style="text-decoration:none;" href="#" class="abc">' + data + '</a>';
            }
        }],
            "aoColumns": [{
            "mData": "code"
        }, {
            "mData": "acctNum"
        }, {
            "mData": "name"
        }]
            });

    }       

})

Asegúrese de que el código que incluyó sea el mismo que el del violín (no lo es) y el que está ejecutando. También en el violín tienes dos aTargets [0], consulta: jsfiddle.net/gL0p0t42
Leandro Carracedo

No está proporcionando la fuente que realmente llama a "aDataSort".
Daniel

¿Te refieres a la identificación de la tabla html? Me he encargado de eso. Déjame intentar tener un objetivo.
swateek


1
Tuve el mismo problema, y ​​descubrí que ordeno por un número de columna que no existe ... solo tenía 3 columnas pero ordené por el quinto.
Hos Mercury

Respuestas:


131

Es importante que su THEAD no esté vacío en la tabla, ya que dataTable requiere que especifique el número de columnas de los datos esperados. Según sus datos, debería ser

<table id="datatable">
    <thead>
        <tr>
            <th>Subscriber ID</th>
            <th>Install Location</th>
            <th>Subscriber Name</th>
            <th>some data</th>
        </tr>
    </thead>
</table>

26
¿Qué sucede si tengo un requisito que implica la configuración de columnas y el número de dichas columnas en tiempo de ejecución? ¿Cómo puedo implementar código para el requisito mencionado anteriormente?
CS Lewis

Esto me ayudó a solucionar mi problema de datos no impresos. Bueno, también me ayudó a solucionar un problema más mío para la tabla de datos donde escribí "Sort":false, luego pude ver la lista en orden descendente que provenía del controlador como Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action).
Sorangwala Abbasali

2
el <thead>debe contener a <tr>, luego <th>s
brahimm

Esto es cierto para un DataTable estándar (y resuelve mi problema). RE: @CSLewis: No estoy seguro con las tablas estáticas, pero si está configurando columnas en tiempo de ejecución junto con una solicitud ajax, no es necesario que tenga nada, <thead>pero debe definir las columnas en su inicio de DataTable () así: tablas de datos .net / referencia / opción / columnas.data
Harvey Dobson

61

También tuve este problema, esta matriz estaba fuera de rango:

order: [1, 'asc'],

1
Este siempre me atrapa. ¿Hay alguna manera de establecer la matriz por defecto en 0, si la matriz está fuera de rango?
JGreasley

6
@JGreasley Puede configurarlo como una matriz vacía: orden: []
hogarth45

2
¡Mine columnas donde 5 y yo estaba especificando 7 aquí! Gracias
aiffin

1
¡Uno! ¡Semana! ¡Una semana completa! ¡Y esa es una semana de 7 días! Y estoy bastante seguro de que estaba no trabajando de 9 a 5, más como de 9 a medianoche ... todo eso perdí porque no sabía nada de este error !! Arrrrrrrrrrrgh !! ... Tanto tiempo perdido, me siento profundamente avergonzado, busqué en Internet una y otra vez y experimenté con todas las soluciones posibles; ninguna se acercaría siquiera a 'arreglar' esto. Y luego ... por mera casualidad y ya desesperado ... encontré tu respuesta, ¡y ta-da! En cinco minutos, todo estaba arreglado . Si fuera rico, te enviaría un cheque por 10.000 € - jajaja
Gwyneth Llewelyn

9

Para mí, el error estaba en DataTables en sí; El código para ordenar en DataTables 1.10.9 no buscará límites; así que si usas algo como

order: [[1, 'asc']]

con una tabla vacía, no hay fila idx 1 -> esta excepción asegura. Esto sucedió cuando los datos de la tabla se obtuvieron de forma asincrónica. Inicialmente, en la carga de la página, la tabla de datos se inicializa sin datos. Debería actualizarse más tarde tan pronto como se obtengan los datos del resultado.

Mi solución:

// add within function _fnStringToCss( s ) in datatables.js
// directly after this line
// srcCol = nestedSort[i][0];

if(srcCol >= aoColumns.length) {
    continue;
}

// this line follows:
// aDataSort = aoColumns[ srcCol ].aDataSort;

Gracias por su elaboración sobre este tema; @ hogarth45 anteriormente identificado el problema / error correctamente, pero no era tan clara acerca de por qué esto era, de hecho, un problema. Te respondo dos años después ... y al parecer esto no se ha corregido, ni siquiera mencionado en la documentación oficial, al menos, que yo sepa.
Gwyneth Llewelyn

7

Enfrenté el mismo problema, los siguientes cambios resolvieron mi problema.

$(document).ready(function() {
     $('.datatable').dataTable( {
            bSort: false,
            aoColumns: [ { sWidth: "45%" }, { sWidth: "45%" }, { sWidth: "10%", bSearchable: false, bSortable: false } ],
        "scrollY":        "200px",
        "scrollCollapse": true,
        "info":           true,
        "paging":         true
    } );
} );

la aoColumnsmatriz describe el ancho de cada columna y sus sortablepropiedades.

Otra cosa para mencionar este error también aparecerá cuando ordene por un número de columna que no existe.


4

En mi caso tuve

$(`#my_table`).empty();

Donde debería haber estado

$(`#my_table tbody`).empty();

Nota: en mi caso tuve que vaciar la tabla ya que tenía datos que quería ir antes de insertar nuevos datos.

¡Solo piense en compartir dónde "podría" ayudar a alguien en el futuro!


1

Tuve este problema y fue porque otro script borraba todas las tablas y las recreaba, pero mi tabla no se estaba recreando. Pasé años en este tema antes de darme cuenta de que mi tabla ni siquiera era visible en la página. ¿Puede ver su tabla antes de inicializar DataTables?

Básicamente, el otro guión estaba haciendo:

let tables = $("table");
for (let i = 0; i < tables.length; i++) {
  const table = tables[i];
  if ($.fn.DataTable.isDataTable(table)) {
    $(table).DataTable().destroy(remove);
    $(table).empty();
  }
}

Y debería haber estado haciendo:

let tables = $("table.some-class-only");
... the rest ...

1

Debe cambiar las comillas simples a comillas [']dobles ["]debido al análisis

si está utilizando el atributo de orden de datos en la tabla, utilícelo asídata-order='[[1, "asc"]]'


no es relevante con la pregunta del OP pero funciona en mi caso (usando atributos de datos html 5)
blackbiron

-1

En mi caso resolví el problema estableciendo un número de columna válido al aplicar la orderpropiedad dentro del script donde configuras la tabla de datos.

var table = $('#mytable').DataTable({
     .
     .
     .
     order: [[ 1, "desc" ]],

Ya hay otras respuestas que dicen básicamente lo mismo. Trate de evitar respuestas redundantes en preguntas que tengan años.
Thelr
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.