DataTables无法读取未定义的属性'length'。

9
以下是文档就绪函数:
Script type="text/javascript" charset="utf-8">
    $(document).ready(function () {
        $('#example').dataTable({
            "bProcessing": true,
            "bServerSide": true,
            "sAjaxSource": "GetUser.ashx",
            "sServerMethod": "POST",
            "sAjaxDataProp" : "",
            "aoColumnDefs": [ {
            "aTargets": [ 0 ],
            "mData": "download_link",
            "mRender": function ( data, type, full ) {
               return '<a href="/UserDetail.aspx?ID='+data+'">Detail</a>';
             }
           } ],
            "aoColumns": [
                { "mData": "LoginId" },
                { "mData": "Name" },
                { "mData": "CreatedDate" }
            ]
        });

以下是从服务器 (GetUser.ashx) 返回的响应:
[
    {
        "UserId": "1",
        "LoginId": "white.smith",
        "Activated": "Y",
        "Name": "Test Account",
        "LastName": "Liu",
        "Email": "white.smith@logical.com",
        "CreatedDate": "1/21/2014 12:03:00 PM",
        "EntityState": "2",
        "EntityKey": "System.Data.EntityKey"
    },
More Data...
]

以下是应该放置数据的HTML表格:

<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
    <thead>
        <tr>
             <th width="15%">User Detail</th>
            <th width="15%">LoginID</th>
            <th width="15%">Name</th>
            <th width="15%">Created Date</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td colspan="5" class="dataTables_empty">Loading data from server</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
             <th width="15%">User Detail</th>
            <th width="15%">LoginID</th>
            <th width="15%">Name</th>
            <th width="15%">Created Date</th>
        </tr>
    </tfoot>
</table>

期望结果:

enter image description here

但是我遇到了一个问题:

当页面正在加载时,浏览器出现了未捕获的异常:

Cannot read property 'length' of undefined 

进一步检查后,发现它来自jquery.dataTables.js的2037行。

var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );

输入图片说明

我检查了JSON的有效性,但是"aData"为null,为什么会这样?


您可以查看调用堆栈并追溯到问题的源头所在的网页... - deostroll
以下属性没有用逗号分隔。这是一种类型吗? "Email": "white.smith@logical.com" "CreatedDate": "1/21/2014 12:03:00 PM" "EntityState": "2", "EntityKey": "System.Data.EntityKey" - Nilesh
@Nilesh 这不是一个类型,只是我在这篇文章中忘记加逗号了,我已经在这里添加了。 - User2012384
抱歉,我的意思是打错字了,不是打错类型 :) - Nilesh
1
依赖于DT版本,请查看http://datatables.net/forums/discussion/11901/uncaught-typeerror-cannot-read-property-length-of-undefined-jquery-datatables-js-1918。 - KingRider
5个回答

9
您的 "sAjaxDataProp" : "" 设为了一个空字符串,导致出现了这个错误。
DataTables 希望在此处有一个字符串来告诉它从服务器返回数据所在的键。 默认情况下,该键为 aaData,因此您的 JSON 数据应包含该键及所有其他可能需要被分页等使用的键。
正常的服务端 JSON 数据:
{
"iTotalRecords":"6",
"iTotalDisplayRecords":"6",
"aaData": [
    [
        "1",
        "sameek",
        "sam",
        "sam",
        "sameek@test.com",
        "1",
        ""
    ],...

由于所有的值都在aaData中,您根本不需要sAjaxDataProp。

修改后的服务器端json数据:

{
"iTotalRecords":"6",
"iTotalDisplayRecords":"6",
"myData": [
    [
        "1",
        "sameek",
        "sam",
        "sam",
        "sameek@test.com",
        "1",
        ""
    ],

现在值存储在myData中,所以你需要通过设置告诉dataTables在哪里找到实际数据:
"sAjaxDataProp" : "myData"

这是一个Plunker

6
由于有4列,请在“aoColumns”中添加以下内容:
"aoColumns": [
  { "mData": null },  // for User Detail
  { "mData": "LoginId" },
  { "mData": "Name" },
  { "mData": "CreatedDate" }
]

对于未定义的长度,我尝试了以下代码并且有效:

$('#example').dataTable({
 "aLengthMenu": [[100, 200, 300], [100, 200, 300]],
  "iDisplayLength": 100,
  "iDisplayStart" : 0,
  "bProcessing": true,
  "bServerSide": true,
  "sAjaxSource": "GetUser.ashx",
  "sServerMethod": "POST",
  "sAjaxDataProp" : "",
  "aoColumnDefs": [ {
    "aTargets": [ 0 ],
    "mData": "download_link",
    "mRender": function ( data, type, full ) {
      return '<a href="/UserDetail.aspx?ID='+data+'">Detail</a>';
    }
  } ],
  "aoColumns": [
    { "mData": null },
    { "mData": "LoginId" },
    { "mData": "Name" },
    { "mData": "CreatedDate" }
  ]
});

了解更多关于aLengthMenu的参考网站是:

https://legacy.datatables.net/ref#aLengthMenu


3
如果您看到这个错误,请查看从服务器返回的json,然后确保您所有的datatable 'mData'值都有匹配条目。如果您还使用了bean,请也检查一下。
此外,对于表格,无需指定'tr'、'td'等。如果您让jquery为您完成,代码会更加简洁。以下是我的表格样式:
<table cellpadding="0" cellspacing="0" border="0" class="display" id="myTable" style="table-layout:fixed" ></table>

然后我的数据表元素指定了宽度和列标题:

{sTitle: "Column A", sWidth: "100px", mData: "idStringFromJson", bSortable: false},

0
当我遇到这个问题时,实际上是由于未应用迁移的结果。我恢复了数据库的备份,但其中还没有运行我的最近模式迁移之一,一旦我运行了迁移,一切都正常工作了。

0

使用 $('#example').DataTable({..(大写的D)代替 $('#example').dataTable({..


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