数据表无法读取未定义的属性“长度”
Posted
技术标签:
【中文标题】数据表无法读取未定义的属性“长度”【英文标题】:DataTables Cannot read property 'length' of undefined 【发布时间】:2014-04-23 14:31:44 【问题描述】:下面是文档准备功能
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 >User Detail</th>
<th >LoginID</th>
<th >Name</th>
<th >Created Date</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="5" class="dataTables_empty">Loading data from server</td>
</tr>
</tbody>
<tfoot>
<tr>
<th >User Detail</th>
<th >LoginID</th>
<th >Name</th>
<th >Created Date</th>
</tr>
</tfoot>
</table>
预期结果:
但是我遇到了一个问题:
页面加载时,浏览器出现未捕获的异常:
Cannot read property 'length' of undefined
当我进一步检查时,它来自 jquery.dataTables.js 的第 2037 行
var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
我检查了json是否有效,但是“aData”为空,为什么会这样?
【问题讨论】:
可以查看调用栈,回溯到网页问题的根源... 以下属性不使用逗号分隔。这是一种类型吗?"Email": "white.smith@logical.com" "CreatedDate": "1/21/2014 12:03:00 PM" "EntityState": "2", "EntityKey": "System.Data.EntityKey"
@Nilesh 不是类型,只是这个帖子忘记加逗号了,这里加回来了
对不起,我的意思是错字不是打字:)
依赖版本DT,看datatables.net/forums/discussion/11901/…
【参考方案1】:
您的"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
【讨论】:
【参考方案2】:由于有 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,然后确保您的所有数据表 '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,
【讨论】:
【参考方案4】:使用$('#example').DataTable(..
(大写D)代替$('#example').dataTable(..
【讨论】:
【参考方案5】:当我遇到这个问题时,它实际上是未应用迁移的结果。我已经恢复了数据库的备份,该备份还没有运行我最近的架构迁移之一,一旦我运行迁移,一切正常。
【讨论】:
以上是关于数据表无法读取未定义的属性“长度”的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的TypeError:无法读取未定义数据表的属性“长度”
未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?