JQuery Datatables:无法读取未定义的 'aDataSort' 属性。

127

我创建了这个fiddle并根据我的要求很好地工作:Fiddle

然而,当我在我的应用程序中使用相同的代码时,浏览器控制台会显示一个错误,内容为Cannot read property 'aDataSort' of undefined

在我的应用程序中,JavaScript 代码如下所示:我已检查了控制器输出……它工作正常,并且也在控制台上打印出来。

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

    }       

})

请确保您包含的代码与fiddle中的代码相同(并非如此),也与您正在运行的代码相同。此外,在fiddle中,您有两个aTargets [0],请检查:http://jsfiddle.net/gL0p0t42/ - Leandro Carracedo
您没有提供实际调用“aDataSort”的源代码。 - Daniel
你是指HTML表格的ID吗?这个我已经处理好了。让我试着只有一个目标。 - swateek
2
与此相关的(更新的)问题和答案,请参见以下链接:https://dev59.com/5ovda4cB1Zd3GeqPUQ-h - Nikos M.
1
我曾经遇到过同样的问题,后来发现是因为我按照一个不存在的列数进行排序。我的表格只有三列,但我却按照第五列进行排序了。 - mercury
显示剩余2条评论
15个回答

166

在表格中,THEAD不能为空。因为dataTable要求您指定期望数据的列数。根据您的数据,应该是:

重要提示:表格中的THEAD不能留空,因为 dataTable 要求您指定所期望数据的列数。根据您的数据,应该如下:

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

33
如果我有一个需求需要在运行时配置列和列数,我该如何实现相关代码? - CS Lewis
这帮助我解决了数据未打印的问题。同时,它还帮助我解决了另一个问题,即在datatable中,当我写下 "Sort":false 时,它能够按照从控制器传递过来的 Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action) 列表以降序查看。 - Sorangwala Abbasali
3
<thead> 中必须包含一个 <tr>,随后是 <th> 元素。 - Siempay
这适用于标准的DataTable(并解决了我的问题)。回复@CSLewis:我不确定静态表格,但如果您在ajax请求期间在运行时配置列,则无需在<thead>中添加任何内容,但必须像这样定义DataTable()初始化中的列:https://datatables.net/reference/option/columns.data - Harvey Dobson

93

我也遇到了这个问题,
这个数组超出范围:

order: [1, 'asc'],

4
这个总是让我头疼。如果数组超出范围,有没有一种方法可以将其默认为0? - JGreasley
7
你可以将它设置为空数组:order: []。 - hogarth45
3
我会尽力进行翻译:“Mine columns where 5 and i was specifying 7 here!” 可以翻译为:“我在这里挖掘的列数是5,但是我指定了7!” - aiffin
3
一个星期!整整一个星期!而且是七天的一周!我敢肯定我不是在工作9点到5点,更像是从9点到午夜……所有这些都因为我不知道这个错误而浪费了!啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!浪费了这么多时间,我感到非常羞愧,我在互联网上搜索了很多次,并尝试了所有可能的解决方案——没有一个能够接近“修复”这个问题。然后……仅仅是偶然的机会和已经绝望……我看到了你的答案,然后哇!在五分钟内,一切都被解决了。 如果我有钱,我会给你寄一张价值1万欧元的支票——哈哈 - Gwyneth Llewelyn

15

对我而言,这个错误出现在DataTables自身上;DataTables 1.10.9的排序代码没有检查边界;因此,如果你使用以下类似的内容:

order: [[1, 'asc']]

在空表中,没有第1行 -> 这个异常确保了这一点。

这是因为表格的数据正在异步获取时发生的。最初,在页面加载时dataTable将被初始化但没有数据。应该在结果数据被获取后立即更新。

我的解决方案:

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

感谢您对此问题的详细说明;@hogarth45 以上 正确地识别了问题/错误,但并不是很清楚为什么这实际上是一个问题。我两年后回答你...显然这还没有得到纠正,甚至在官方文档中也没有提到,至少据我所知。 - Gwyneth Llewelyn

8

我遇到了同样的问题,以下更改解决了我的问题。

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

aoColumns数组描述了每个列的宽度和其可排序的属性。

还有一件需要提到的事情是,当你按不存在的列号排序时,也会出现此错误。


4
在我的情况下,我有
$(`#my_table`).empty();

它本应该放在哪里。
$(`#my_table tbody`).empty();

注意:在我的情况下,我必须清空表格,因为我想要删除旧数据以便插入新数据。
只是想分享一下,希望能对未来的某个人有所帮助!

4
在我的情况下,我通过在配置数据表的脚本中应用order属性时建立一个有效的列号来解决了这个问题。
var table = $('#mytable').DataTable({
     .
     .
     .
     order: [[ 1, "desc" ]],

已经有其他答案基本上说了同样的事情。请尽量避免在几年前的问题上重复回答。 - thelr

3

由于解析的原因,您需要将单引号[']更改为双引号["]

如果您正在使用表格上的data-order属性,则应像这样使用它:data-order='[[1, "asc"]]'


这与OP的问题无关,但在我的情况下它有效(使用HTML 5数据属性)。 - blackbiron

3

大部分时候,这种情况发生在某些未定义的东西上。我复制了代码并删除了一些干扰索引顺序的列,小心地进行更改,并每次更改之后检查每个变量。 "order": [[1, "desc"]],解决了我的问题,先前我使用的是 "order": [[24, "desc"]], 而该索引不存在。


2
关于order: [...],我只是想提出我的两分意见; 它不会检查项目类型,在我的情况下,我传递的是[arrOrders]而不是只有arrOrders[...arrOrders],导致结果为[[[ 1, "desc" ], [ 2, "desc" ]]]

2

我的解决方案

添加以下内容:

order: 1 ,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接