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"
        }]
            });

    }       

})
Swateek
fuente
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
2
pregunta relacionada (más reciente) con respuesta
Nikos M.
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>
Gkrish
fuente
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'],
hogarth45
fuente
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;
Oliver Zendel
fuente
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.

Abdul Manan
fuente
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!

SaltandoElefante
fuente
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 ...
Ryan Shillington
fuente
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"]]'

MohitGhodasara
fuente
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" ]],
usuario13755332
fuente
Ya hay otras respuestas que dicen básicamente lo mismo. Trate de evitar respuestas redundantes en preguntas que tengan años.
Thelr