DataTables jqueryプラグインは初めてです。 IE 8はJavaScriptでパフォーマンスの問題があったことを発見した後、DataTablesを使用してサーバー側の処理を行う方法を変更することにしました。JSPの読み込み時にこのエラーメッセージが表示されます春3):
DataTables warning (table id = 'results_table'): Requested unknown parameter '0' from the data source for row 0
私はグーグルで調べて、そのエラーメッセージの多くの原因が不正なJSONにあることを発見したので、JSONをSpring 3コントローラ関数から出力して作成するJSONを見る方法を見つけ、それを取得するためにコードを変更しました DataTables のサイトが表示されるべきものにかなり近いこと。
まだ喜びはありませんが、そのエラーメッセージが表示されます。
DataTablesで見つけたサーバー側の処理の例には、クライアント側で使用される列を指定するコードが含まれていなかったため、必要ではないと仮定しました。私は?
ここに私の結果の関連部分があります。jsp:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ACME: search results in a Nice DataTables.net Plugin</title>
</head>
<body>
<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css" />
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery-1.7.js"></script>
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery.dataTables.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#results_table').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sScrollX": "600px",
"sServerMethod": "POST",
"sAjaxSource": "/acme/resultstable",
} );
} );
</script>
<form id="command" name="f" action="employee" method="post">
<div id = "results">
<table id = "results_table">
<thead>
<tr>
<th> </th>
<th>ID</th>
<th>NO_PRINT</th>
<th>Full Name</th>
<th>Email Address</th>
<th>Phone Number</th>
<th>Organization</th>
<th>Organization Code</th>
<th>Position</th>
<th>Employee Type</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
ここに私が送ってきたJSONレスポンスがあります:
{
"sEcho" : 1,
"iTotalRecords" : 1,
"iTotalDisplayRecords" : 1,
"aaData" : [ {
"person_id" : "888888",
"ID" : "999999",
"no_print" : " ",
"fullname" : "Obama, Willard",
"email_address" : "<a href = \"mailto:[email protected]\">[email protected]</a>",
"current_phone_number" : "303-867-5309",
"title" : " ",
"office" : " ",
"position" : "Contractor",
"empl_code" : "CONT"
} ]
}
これは、Jackson経由でJSON応答を送信するために使用しているSpringコントローラー関数です。これには、JSONを出力するコードが含まれているため、どのように見えるかを確認できます。 JSONがstdoutに出力するJSONとDataTablesに送り返す内容が異なる可能性はありますか?
@RequestMapping(value = "/resultstable", method = RequestMethod.POST)
public @ResponseBody LinkedHashMap resultstable(ModelMap model,
HttpSession session,
@RequestParam (required=true) int sEcho,
@RequestParam (required=true) int iDisplayStart,
@RequestParam (required=true) int iDisplayLength,
@RequestParam (required=true) int iColumns,
@RequestParam (required=true) int iSortCol_0,
@RequestParam (required=false)String sSortDir_0,
@RequestParam (required=true) String sSearch ) {
/*
**********************************************************************
** These come from the DataTables.net Jquery plugin on results.jsp
**********************************************************************
** sEcho, - just send it back, used by DataTables for synching
** iDisplayStart - index of the record to start with, ie 3 for the 3rd of 100 records
** iDisplayLength - number of records to send back starting with iDisplayStart
** iColumns - number of columns to be displayed in the table
** iSortCol_0 - the number of thee column to be sorted on
** sSortDir_0 - direction of sorting: asc or desc
** sSearch - from the search box, filter results further on this term
**********************************************************************
*/
String nextView = "results";
String usertype = (String)session.getAttribute("usertype");
Search search = new Search(usertype);
List<LinkedHashMap> records = null;
String results = null;
int number_of_records = (Integer)session.getAttribute("number_of_records_found");
ResultsView rv = new ResultsView();
ResultsScreenTableHolder rstrh = null;
SearchScreenDataHolder ssdh2 = (SearchScreenDataHolder)session.getAttribute("search_screen_data_holder");
ObjectMapper mapper = new ObjectMapper();
logger.debug("started");
logger.debug("sEcho, == " + sEcho );
logger.debug("iDisplayStart == " + iDisplayStart );
logger.debug("iDisplayLength == " + iDisplayLength );
logger.debug("iColumns == " + iColumns );
logger.debug("iSortCol_0 == " + iSortCol_0 );
logger.debug("sSortDir_0 == " + sSortDir_0 );
logger.debug("sSearch == " + sSearch );
try {
records = search.searchForAnEmployee(ssdh2,usertype,sSearch,"asc",
iSortCol_0,iDisplayStart,
iDisplayLength);
LinkedHashMap lhm= new Java.util.LinkedHashMap();
lhm.put("sEcho", sEcho);
lhm.put("iTotalRecords",number_of_records);
lhm.put("iTotalDisplayRecords",9);
lhm.put("aaData",records);
// convert user object to json string, and save to a file
mapper.writeValue(new File("c:\\Downloads\\rstrh.json.txt"), lhm);
// display to console
logger.debug("My JSON: " + mapper.defaultPrettyPrintingWriter().writeValueAsString(lhm));
}
catch (Exception e) {
logger.debug("\n",e);
}
return lhm;
}// end function
今朝も同じ問題を抱えていました。 aoColumns
パラメーターが必要であり、次のようにmDataProp
を使用する必要があります。
https://Gist.github.com/1660712
少なくとも私の問題は解決しました。
私も同じ警告に遭遇しましたが、原因は異なりました。データにnull値がありました。 JSON形式は正しいものでしたが、DataTablesにはnullsを表示するためのデフォルトルールがありません。解決策は、sDefaultContentプロパティを使用することでした。
サンプルaaData:
aaData: [
{ "Field1": "Foo", "Field2":null },
{ "Field1": "Bar", "Field2":null },
]
そして、aoColumnsでは、次のようにプロパティを使用できます。
aoColumns: [
{ "mData": "Field1", sDefaultContent: "n/a" },
{ "mData": "Field2", sDefaultContent: "" }
]
これは現在の問題ではありませんが、将来この問題が発生する可能性があります。
これがお役に立てば幸いです。
sDefaultContentオプションは、警告ボックスのみを表示しないようにします。データテーブルは、null値を表示するルールを見つけられません。
テーブル内のヌル値を変更すると、この警告はなくなります。
このエラーを回避するには、「th」列のテーブル番号がデータ列(数値)を返すのと同じである必要があります。上記の問題ではaaDataです。
"aaData" : [
[
"person_id" : "888888",
"ID" : "999999",
],
[
"person_id" : "8888889",
"ID" : "9999990",
]
]
これは、サーバー側の言語からデータを返す正しい形式です。同じ方法で問題を解決しました。
それが誰かに役立つ場合、mRender関数名にピリオドがあったため、同様のエラーが発生しました:My.Namespace.MyFunction(data, row);
この行:var a = _fnSplitObjNotation( src );
それを別々のオブジェクトに分割します。これは明らかにエラーを生成します。
を使用して
My_Namespace_MyFunction(data, row);
さらに、JavaScript関数オブジェクトの代わりに文字列関数名を渡すと、このエラーに気付きました。