JQuery DataTableを使用して、テーブルに大量のデータを表示しています。私はこのようなAjaxリクエストで賢明なデータページを取得しています:
var pageNo = 1;
$('#propertyTable').dataTable( {
"processing": true,
"serverSide": true,
"ajax": "${contextPath}/admin/getNextPageData/"+pageNo+"/"+10,
"columns": [
{ "data": "propertyId" },
{ "data": "propertyname" },
{ "data": "propertyType" },
{ "data": "hotProperties" },
{ "data": "address" },
{ "data": "state" },
{ "data": "beds" },
{ "data": "city" },
{ "data": "zipCode" }
],
"fnDrawCallback": function () {
pageNo = this.fnPagingInfo().iPage+1;
alert(pageNo); // this alerts correct page
}
} );
そしてこれがスプリングコントローラーです:
@RequestMapping(value="/getNextPageData/{pageNo}/{propertyPerPage}")
public @ResponseBody PropertyDatatableDto getNextPageData(@PathVariable Integer pageNo, @PathVariable Integer propertyPerPage) {
System.out.println("called");
System.out.println(pageNo); // this always prints 1, what i need is current pageNo here
PropertyDatatableDto datatableDto = new PropertyDatatableDto();
//datatableDto.setDraw(1);
datatableDto.setRecordsTotal(100);
datatableDto.setRecordsFiltered(100);
datatableDto.setData(adminService.getAllPropertyList());
return datatableDto;
}
問題は、テーブルのページを変更すると、ページの正しいpageNo
が(JavaScriptで)警告されることですが、Spring Controllerでは常に変数pageNo
に割り当てられた初期値が取得され、現在のページ番号。
pageNo
を動的にSpring Controllerに渡すにはどうすればよいですか?どんな助けでもありがたいです。
私はこのようにJavaScriptを更新しました:
var oSettings = $('#propertyTable').dataTable().fnSettings();
var currentPageIndex = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
$('#propertyTable').dataTable({
"processing": true,
"serverSide": true,
"ajax": "${contextPath}/admin/getNextPageData/"+currentPageIndex+"/"+10,
"columns": [
{ "data": "propertyId" },
{ "data": "propertyname" },
{ "data": "propertyType" },
{ "data": "hotProperties" },
{ "data": "address" },
{ "data": "state" },
{ "data": "beds" },
{ "data": "city" },
{ "data": "zipCode" }
]
});
しかし、それは私にエラーを与えています:
DataTables警告:テーブルid = propertyTable-DataTableを再初期化できません。
DataTablesは、ページ番号の計算に使用できるリクエストでパラメーターstart
およびlength
をすでに送信しています。詳細は サーバー側の処理 を参照してください。
それでもページ番号を含むURL構造が必要な場合は、以下のコードを使用できます。
"ajax": {
"data": function(){
var info = $('#propertyTable').DataTable().page.info();
$('#propertyTable').DataTable().ajax.url(
"${contextPath}/admin/getNextPageData/"+(info.page + 1)+"/"+10
);
}
},
「未テスト」編集:「retrieve」を追加:テーブルインスタンス(v1.10)を取得するオプションにtrue、テーブルが存在するかどうかをチェック。データテーブルv1.10のfnSettingsをsetting()に変更しました。
データテーブル設定から読み取り、次に設定読み取り _ iDisplayStart および _ iDisplayLength から読み取って、現在のページインデックスを次のように計算できます。
var currentPageIndex = 1;
//Is datatable already initialized?
if ( $.fn.DataTable.isDataTable( '#propertyTable' ) ) {
//Get the current settings and calculate current page index
var oSettings = $('#propertyTable').dataTable({"retrieve": true}).settings();
currentPageIndex = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
}
次に、ajax呼び出しでcurrentPageIndexを渡します。
"ajax": "${contextPath}/admin/getNextPageData/"+currentPageIndex +"/"+10,