Tables de données JQuery: impossible de lire la propriété 'aDataSort' sur undefined

95

J'ai créé ce violon et cela fonctionne bien selon mes exigences: Fiddle

Cependant, lorsque j'utilise la même chose dans mon application, j'obtiens une erreur dans la console du navigateur disant Impossible de lire la propriété 'aDataSort' de undefined

Dans mon application, le javascript lit quelque chose comme ci-dessous: J'ai vérifié la sortie du contrôleur ... cela fonctionne bien et est également imprimé sur la 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"
        }]
            });

    }       

})
swateek
la source
Veuillez vous assurer que le code que vous avez inclus est le même que le violon (ce n'est pas le cas) et celui que vous utilisez. Aussi dans le violon, vous avez deux aTargets [0], vérifiez: jsfiddle.net/gL0p0t42
Leandro Carracedo
Vous ne fournissez pas la source qui appelle réellement "aDataSort".
Daniel
Voulez-vous dire l'id de la table html? J'ai pris soin de ça. Laissez-moi essayer d'avoir un objectif.
swateek
@Daniel la source est le paramètre de la fonction loadDataTable ().
swateek
2
question connexe (plus récente) avec réponse
Nikos M.

Réponses:

131

Il est important que votre THEAD ne soit pas vide dans le tableau car dataTable vous oblige à spécifier le nombre de colonnes des données attendues. Selon vos données, il devrait être

<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
la source
26
Que faire si j'ai une exigence qui implique la configuration des colonnes et le nombre de ces colonnes au Runtime? Comment puis-je implémenter du code pour l'exigence susmentionnée?
CS Lewis
Cela m'a aidé à résoudre mon problème de données non imprimées. Eh bien, cela m'a également aidé à résoudre un autre problème du mien pour datatable où j'ai écrit "Sort":false, puis il a pu afficher la liste dans l'ordre décroissant provenant du contrôleur Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action).
Sorangwala Abbasali
2
le <thead>doit contenir un <tr>, puis <th>s
brahimm
Cela est vrai pour un DataTable standard (et résout mon problème). RE: @CSLewis: Je ne suis pas sûr avec les tables statiques, mais si vous configurez des colonnes au moment de l'exécution avec une requête ajax, il n'est pas nécessaire d'avoir quoi que ce soit, <thead>mais vous devez définir les colonnes dans votre initiation DataTable () comme ceci: datatables .net / reference / option / columns.data
Harvey Dobson
60

Également eu ce problème, ce tableau était hors de portée:

order: [1, 'asc'],
hogarth45
la source
1
Celui-ci me comprend toujours. Existe-t-il un moyen de définir par défaut le tableau sur 0, si le tableau est hors de portée?
JGreasley
6
@JGreasley Vous pouvez le définir comme un tableau vide: order: []
hogarth45
2
Mine colonnes où 5 et je spécifiais 7 ici! Merci
aiffin
1
Une! La semaine! Une semaine complète! Et c'est une semaine de 7 jours! Et je suis à peu près sûr que je ne travaillais pas de 9h à 17h, plutôt de 9h à minuit ... tout cela perdu parce que je ne connaissais pas ce bug !! Arrrrrrrrrrrgh !! ... Tant de temps perdu, j'ai profondément honte, j'ai cherché sur Internet encore et encore et j'ai expérimenté toutes les solutions possibles - aucune ne serait même proche de «réparer» cela. Et puis ... par hasard et déjà désespéré ... je suis tombé sur ta réponse, et ta-da! En cinq minutes, tout était arrangé . Si j'étais riche, je vous enverrais un chèque de 10K € - lol
Gwyneth Llewelyn le
9

Pour moi, le bogue était dans DataTables lui-même; Le code de tri dans DataTables 1.10.9 ne vérifiera pas les limites; donc si vous utilisez quelque chose comme

order: [[1, 'asc']]

avec une table vide, il n'y a pas de ligne idx 1 -> cette exception garantit. Cela s'est produit lorsque les données de la table étaient extraites de manière asynchrone. Initialement, lors du chargement de la page, la table dataTable est initialisée sans données. Il doit être mis à jour plus tard dès que les données de résultat sont récupérées.

Ma solution:

// 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
la source
Merci pour votre élaboration sur cette question; @ hogarth45 ci-dessus a identifié correctement le problème / bogue, mais n'était pas aussi clair sur la raison pour laquelle c'était, en fait, un problème. Je vous réponds deux ans plus tard ... et apparemment cela n'a pas été corrigé, pas même mentionné dans la documentation officielle, du moins, pour autant que je sache.
Gwyneth Llewelyn
7

J'ai rencontré le même problème, les changements suivants ont résolu mon problème.

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

le aoColumnstableau décrit la largeur de chaque colonne et ses sortablepropriétés.

Une autre chose à mentionner cette erreur apparaîtra également lorsque vous commandez par un numéro de colonne qui n'existe pas.

Abdul Manan
la source
4

Dans mon cas, j'avais

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

Où ça aurait dû être

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

Remarque: dans mon cas, j'ai dû vider la table car j'avais des données que je voulais supprimer avant d'insérer de nouvelles données.

Je pensais juste à partager là où cela «pourrait» aider quelqu'un dans le futur!

SautÉléphant
la source
1

J'ai eu ce problème et c'était parce qu'un autre script supprimait toutes les tables et les recréait, mais ma table n'était pas recréée. J'ai passé des années sur ce problème avant de remarquer que mon tableau n'était même pas visible sur la page. Pouvez-vous voir votre table avant d'initialiser DataTables?

Essentiellement, l'autre script faisait:

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

Et cela aurait dû faire:

let tables = $("table.some-class-only");
... the rest ...
Ryan Shillington
la source
1

Vous devez remplacer les guillemets simples par des guillemets [']doubles à ["]cause de l'analyse

si vous utilisez l' attribut d' ordre des données sur la table, utilisez-le comme cecidata-order='[[1, "asc"]]'

MohitGhodasara
la source
ce n'est pas pertinent avec la question de l'OP mais cela fonctionne sur mon cas (en utilisant les attributs de données html 5)
blackbiron
-1

Dans mon cas, j'ai résolu le problème en établissant un numéro de colonne valide lors de l'application de la orderpropriété à l'intérieur du script où vous configurez la table de données.

var table = $('#mytable').DataTable({
     .
     .
     .
     order: [[ 1, "desc" ]],
user13755332
la source
Il y a déjà d'autres réponses qui disent essentiellement la même chose. Essayez d'éviter les réponses redondantes sur des questions vieilles de plusieurs années.
thelr