以下はドキュメント準備機能です
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": "[email protected]",
"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>
期待される結果:
しかし、私は問題に遭遇しました:
ページの読み込み中に、ブラウザからキャッチされない例外が発生しました:
Cannot read property 'length' of undefined
さらに確認すると、jquery.dataTables.jsの2037行から取得されました
var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
私はjsonが有効であることを確認しましたが、「aData」がnullでした、なぜこれが起こるのですか?
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
について詳しく知るための参照サイトは次のとおりです。
君の "sAjaxDataProp" : ""
は空の文字列に設定されているため、このエラーが発生します。
dataTablesは、サーバーが返したデータを見つけることができるキーの下に、ここに文字列があることを期待しています。これはデフォルトでaaDataに設定されているため、jsonは、ページネーションなどによって返される、または必要になる可能性のある他のすべてのキーの中でこのキーを含める必要があります。
通常のサーバーサイドjson:
{
"iTotalRecords":"6",
"iTotalDisplayRecords":"6",
"aaData": [
[
"1",
"sameek",
"sam",
"sam",
"[email protected]",
"1",
""
],...
すべての値はaaDataにあるため、sAjaxDataPropはまったく必要ありません。
変更されたサーバーサイドjson:
{
"iTotalRecords":"6",
"iTotalDisplayRecords":"6",
"myData": [
[
"1",
"sameek",
"sam",
"sam",
"[email protected]",
"1",
""
],
これで値はmyDataにあります。したがって、次のように設定して、dataTablesに実際のデータの場所を通知する必要があります。
"sAjaxDataProp" : "myData"
これが Plunker です
このエラーが表示された場合は、サーバーから返された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},
$('#example').DataTable({..
の代わりに$('#example').dataTable({..
(大文字のD)を使用します
この問題に遭遇したとき、それは実際には適用されていない移行の結果でした。データベースのバックアップを復元しましたが、データベースのバックアップはまだ実行されていません。移行を実行すると、すべてが正常に機能しました。