jQuery数据表:无法读取未定义的属性“ aDataSort”


96

我创造了这个小提琴和它运作良好,按我的要求:小提琴

但是,当我在应用程序中使用相同的内容时,在浏览器控制台中出现错误,提示无法读取未定义的属性“ aDataSort”

在我的应用程序中,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"
        }]
            });

    }       

})

请确保您包含的代码与小提琴(不是)和您正在运行的代码相同。同样在小提琴中,您有两个aTargets [0],请检查:jsfiddle.net/gL0p0t42
Leandro

您没有提供实际调用“ aDataSort”的源。
丹尼尔(Daniel)

您是说html表的ID吗?我已经照顾好了。让我尝试一个目标。
swateek

@Daniel源是loadDataTable()函数的参数。
swateek

Answers:


131

重要的是,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>

26
如果我的要求涉及在运行时配置列和所述列的数量,该怎么办?如何实现上述要求的代码?
CS刘易斯

这帮助我解决了数据无法打印的问题。嗯,这还帮助我解决了我编写的datatable的另一个问题"Sort":false,然后它能够​​以降序方式查看来自控制器as的列表Model.OrderByDescending(x=>x.Action==0).ThenBy(x=>x.Action)
Sorangwala Abbasali

2
<thead>必须包含一个<tr>,然后<th>Ş
brahimm

对于标准DataTable来说,这是正确的(并解决了我的问题)。RE:@CSLewis:我不确定静态表,但是如果您在运行时与ajax请求一起配置列,则不需要包含任何内容,<thead>但是您必须像这样在DataTable()初始化中定义列:datatables .net / reference / option / columns.data
Harvey Dobson

61

也有此问题,此数组超出范围:

order: [1, 'asc'],

1
这个总是让我受益。如果数组超出范围,是否可以将数组默认设置为0?
JGreasley'17年

6
@JGreasley您可以将其设置为空数组:order:[]
hogarth45 '17

2
我在这里指定5和7的矿井!谢谢
aiffin

1
之一!周!一整周!那是一个7天的一周!而且我非常确定我没有 9比5的工作,更像是9点至午夜的工作...所有这些都丢失了,因为我不知道这个错误!Arrrrrrrrrrrgh !! ...浪费了这么多时间,我感到非常ham愧,我一次又一次地搜索Internet,并尝试了所有可能的解决方案-没有人能甚至“解决”这个问题。然后...只是偶然的机会,已经绝望了...我碰到了你的答案,!五分钟之内,一切都固定了。如果我有钱,我会寄给你一张10K欧元的支票—大声笑
Gwyneth Llewelyn

9

对我而言,该错误在于DataTables本身。DataTables 1.10.9中用于排序的代码不会检查范围;因此,如果您使用类似

order: [[1, 'asc']]

如果表为空,则没有行idx 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

7

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

$(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数组描述每列的宽度及其sortable属性。

当您按不存在的列号进行订购时,也会出现另一种提及此错误的信息。


4

就我而言

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

应该在哪里

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

注意:在我的情况下,我必须清空表,因为在插入新数据之前,我有想要删除的数据。

只是想过分享它在“可能”的地方会在将来对某人有所帮助!


1

我遇到了这个问题,这是因为另一个脚本正在删除所有表并重新创建它们,但是并没有重新创建我的表。我花了很长时间在这个问题上,直到我发现我的桌子在页面上什至不可见。在初始化DataTables之前可以看到表吗?

本质上,另一个脚本正在执行:

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

它应该一直在做:

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

1

由于解析,您需要将单引号切换[']为双引号["]

如果您在表上使用data-order属性,则按如下方式使用它data-order='[[1, "asc"]]'


它与OP的问题无关,但适用于我的情况(使用html 5数据属性)
blackbiron

-1

就我而言,我通过在order配置数据表的脚本中应用属性时建立有效的列号来解决该问题。

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

已经有其他答案说基本相同的事情。请尝试避免对已有多年历史的问题重复回答。
6
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.