JQuery Datatables: Impossibile leggere la proprietà "aDataSort" di undefined


96

Ho creato questo violino e funziona bene secondo le mie esigenze: Fiddle

Tuttavia, quando utilizzo lo stesso nella mia applicazione, ricevo un errore nella console del browser che dice Impossibile leggere la proprietà 'aDataSort' di undefined

Nella mia applicazione, il javascript legge qualcosa come di seguito: ho controllato l'output del controller ... funziona bene ed è stampato anche sulla console.

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

    }       

})

Assicurati che il codice che hai incluso sia lo stesso del violino (non lo è) e quello che stai eseguendo. Anche nel violino hai due aTargets [0], controlla: jsfiddle.net/gL0p0t42
Leandro Carracedo

Non stai fornendo la fonte che effettivamente chiama "aDataSort".
Daniel,

Intendi l'ID della tabella html? Mi sono preso cura di questo. Fammi provare con un obiettivo.
Swateek

@ Daniel the source è il parametro della funzione loadDataTable ().
Swateek

Risposte:


131

È importante che il tuo THEAD non sia vuoto nella tabella poiché dataTable richiede di specificare il numero di colonne dei dati attesi. Secondo i tuoi dati dovrebbe essere

<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
Cosa succede se ho un requisito che implica la configurazione delle colonne e il numero di dette colonne in Runtime? Come posso implementare il codice per il suddetto requisito?
CS Lewis

Questo mi ha aiutato a risolvere il mio problema di dati non stampati. Bene, mi ha anche aiutato a risolvere un altro mio problema per i dati in cui ho scritto "Sort":false, quindi è stato in grado di visualizzare l'elenco in ordine decrescente che proveniva dal controller come Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action).
Sorangwala Abbasali

2
il <thead>deve contenere una <tr>, quindi <th>s
brahimm

Questo è vero per un DataTable standard (e risolve il mio problema). RE: @CSLewis: non sono sicuro delle tabelle statiche, ma se stai configurando colonne in fase di esecuzione insieme a una richiesta ajax non è necessario avere nulla <thead>ma devi definire le colonne nella tua iniziazione DataTable () in questo modo: datatables .net / reference / option / columns.data
Harvey Dobson il

61

Aveva anche questo problema, questo array era fuori portata:

order: [1, 'asc'],

1
Questo mi prende sempre. C'è un modo per impostare come predefinito l'array su 0, se l'array è fuori intervallo?
JGreasley

6
@JGreasley Puoi impostarlo come un array vuoto: order: []
hogarth45

2
Le mie colonne dove 5 e io stavamo specificando 7 qui! Grazie
aiffin

1
Uno! Settimana! Una settimana intera! E questa è una settimana di 7 giorni! E sono abbastanza sicuro che mi è stato non lavoravo 9-a-5, più simile a 9-to-mezzanotte ... tutti che ha perso perché non sapevo di questo bug !! Arrrrrrrrrrrgh !! ... Così tanto tempo sprecato, mi vergogno profondamente, ho cercato in Internet più e più volte e ho sperimentato tutte le soluzioni possibili - nessuna si sarebbe nemmeno avvicinata per "risolvere" questo problema. E poi ... per puro caso e già disperato ... mi sono imbattuto nella tua risposta, e ta-da! In cinque minuti tutto è stato risolto . Se fossi ricco, ti manderei un assegno di 10.000 € - lol
Gwyneth Llewelyn

9

Per me, il bug era in DataTables stesso; Il codice per l'ordinamento in DataTables 1.10.9 non controllerà i limiti; quindi se usi qualcosa come

order: [[1, 'asc']]

con una tabella vuota, non ci sono righe idx 1 -> garantisce questa eccezione. Ciò è accaduto mentre i dati per la tabella venivano recuperati in modo asincrono. Inizialmente, durante il caricamento della pagina, dataTable viene inizializzato senza dati. Dovrebbe essere aggiornato in un secondo momento non appena vengono recuperati i dati dei risultati.

La mia soluzione:

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

Grazie per la tua elaborazione su questo problema; @ hogarth45 sopra ha identificato correttamente il problema / bug, ma non era così chiaro perché questo fosse, in effetti, un problema. Ti rispondo due anni dopo ... e apparentemente questo non è stato corretto, nemmeno menzionato nella documentazione ufficiale, almeno, per quanto ne so.
Gwyneth Llewelyn,

7

Ho affrontato lo stesso problema, le seguenti modifiche hanno risolto il mio 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
    } );
} );

l' aoColumnsarray descrive la larghezza di ogni colonna e le sue sortableproprietà.

Un'altra cosa per menzionare questo errore apparirà anche quando ordini per un numero di colonna che non esiste.


4

Nel mio caso l'ho fatto

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

Dove avrebbe dovuto essere

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

Nota: nel mio caso ho dovuto svuotare la tabella poiché avevo i dati che volevo andassero prima di inserire nuovi dati.

Ho solo pensato di condividere dove "potrebbe" aiutare qualcuno in futuro!


1

Ho avuto questo problema ed era perché un altro script stava eliminando tutte le tabelle e le ricreava, ma la mia tabella non veniva ricreata. Ho passato anni su questo problema prima di notare che la mia tabella non era nemmeno visibile sulla pagina. Riesci a vedere la tua tabella prima di inizializzare DataTables?

In sostanza, l'altro script stava facendo:

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

E avrebbe dovuto fare:

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

1

È necessario passare da virgolette singole a virgolette [']doppie a ["]causa dell'analisi

se stai usando l' attributo data-order sulla tabella, usalo in questo mododata-order='[[1, "asc"]]'


non è rilevante con la domanda dell'OP ma funziona sul mio caso (utilizzando gli attributi dei dati HTML 5)
blackbiron

-1

Nel mio caso ho risolto il problema stabilendo un numero di colonna valido quando si applica la orderproprietà all'interno dello script in cui si configura la tabella dati.

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

Ci sono già altre risposte che dicono sostanzialmente la stessa cosa. Cerca di evitare risposte ridondanti a domande vecchie di anni.
thelr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.