web-dev-qa-db-ja.com

DataTablesは未定義のプロパティ「長さ」を読み取れません

以下はドキュメント準備機能です

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>

期待される結果:

enter image description here

しかし、私は問題に遭遇しました:

ページの読み込み中に、ブラウザからキャッチされない例外が発生しました:

Cannot read property 'length' of undefined 

さらに確認すると、jquery.dataTables.jsの2037行から取得されました

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

enter image description here

私はjsonが有効であることを確認しましたが、「aData」がnullでした、なぜこれが起こるのですか?

9
User2012384

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#aLengthMen

6
Smruti

君の "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 です

9
mainguy

このエラーが表示された場合は、サーバーから返された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},
3
MattC

$('#example').DataTable({..の代わりに$('#example').dataTable({..(大文字のD)を使用します

0
Tayba

この問題に遭遇したとき、それは実際には適用されていない移行の結果でした。データベースのバックアップを復元しましたが、データベースのバックアップはまだ実行されていません。移行を実行すると、すべてが正常に機能しました。

0
Daniel Hawkins