Ajax DataTable 数据没有改变
Ajax DataTable data not changing
我有一个 DataTable ajax 将值传递给控制器。请参阅下面的代码片段以获取我的简化代码。
$(function() {
$("#tableDiv").hide();
$("#submitDateFilters").on("click", function() {
displayData();
$("#tableDiv").show();
document.getElementById("dateFilters").reset();
});
});
////////////////////
// Table Header Contents
////////////////////
var tblReport = {};
var table;
var tableCont = {
"db_columns": [
"TYPE", "USER_ID", "USER_NAME", "DATE_ACCESS", "SESSION_ID", "PROJECT"
]
};
var obj = new Object();
////////////////////
// Create Table
////////////////////
function createTbl(wrapper) {
wrapper.empty();
wrapper.append(
$("<table/>").append($("<thead/>"), $("<tfoot/>"))
);
// row header
var row = $("<tr/>");
$.each(tableCont["db_columns"], function(i, val) {
row.append($("<th/>").text(val.replace(/\_/g, " ")));
});
$("table", wrapper).find("thead, tfoot").append(row);
return $("table", wrapper);
}
////////////////////
// Initialize Datatables
////////////////////
function displayData() {
var wrapper = $(".tbl-wrapper");
var dataObj = new Object();
dataObj.cols = tableCont["db_columns"];
var sDate = $("#startDate").val();
var eDate = $("#endDate").val();
if ($.isEmptyObject(tblReport)) {
//** create table
tblReport = createTbl(wrapper);
//** assign datatable columns
var columns = [];
$.each(tableCont["db_columns"], function(k, val) {
columns.push({
"data": val
});
});
//** initialize datatable
table = tblReport.DataTable({
"order": [
[3, "desc"]
],
"lengthMenu": [
[20, 50, 100, 200],
[20, 50, 100, 200]
],
"serverSide": true,
"processing": true,
"deferRender": true,
"destroy": true,
"ajax": {
"url": "getTableData",
"type": "POST",
"data": {
jsonData: JSON.stringify(dataObj),
startDate: sDate,
endDate: eDate
},
"cache": false
},
"columns": columns,
"columnDefs": [{
"data": undefined,
"defaultContent": "",
"targets": "_all"
}],
"drawCallback": function() {
//** re-adjust filters WIDTH
},
"initComplete": function() {
//** initialize COLUMN FILTERS
}
});
//** reload page on DATATABLE ERROR
$.fn.dataTable.ext.errMode = function(error) {
alert(error.toString());
//window.location.reload(true);
};
} else {
table.ajax.reload();
}
}
$("#startDate").datepicker({
maxDate: '0',
constrainInput: true,
changeYear: true,
changeMonth: true,
showOtherMonths: true,
selectOtherMonths: true,
onSelect: function(selectedDate) {
$("#endDate").datepicker("option", "minDate", selectedDate);
}
});
$("#endDate").datepicker({
maxDate: '0',
constrainInput: true,
changeYear: true,
changeMonth: true,
showOtherMonths: true,
selectOtherMonths: true,
onSelect: function(selectedDate) {
$("#startDate").datepicker("option", "maxDate", selectedDate);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.11/jquery.min.js"></script>
<div class="report-wrapper" align="center">
<div style="margin-bottom:5px;" align="center">
<form method="POST" action="getTableData" enctype="multipart/form-data" id="dateFilters">
<table>
<tr>
<td class="txt-bold"> FILTER DATE FROM: </td>
<td><input type="text" name="startDate" id="startDate" /></td>
<td class="txt-bold"> TO: </td>
<td style="padding-left:5px;"><input type="text" name="endDate" id="endDate" /></td>
<td><button type="button" id="submitDateFilters">Search</button></td>
</tr>
</table>
</form>
</div>
<div class="datatbl" style="width:1115px;" id="tableDiv"></div>
</div>
单击“搜索”按钮后,将调用函数 displayData(),并且 ajax 调用将发送一个请求。这对于第一次调用工作正常,但在接下来的按钮点击中,ajax 发送第一次调用的 startDate 和 endDate 值。
ajax/my 代码有什么问题,我该如何解决?
编辑:
我刚刚发现这是由我的脚本的 ajax.reload()
不工作引起的。我已将 DataTable 代码添加到代码段中。
ajax.data
选项使用函数而不是对象。并在调用函数时从 startDate 和 endDate 控件中检索数据。
如果您将对象用于 ajax.data
选项,您的代码将仅在初始化时被评估一次。如果您为 ajax.data
选项使用函数,则每次加载或重新加载 table 时都会调用它。
例如:
"ajax": {
"url": "getTableData",
"type": "POST",
"data": function ( d ) {
d.jsonData = JSON.stringify(dataObj);
d.startDate = $("#startDate").val();
d.endDate = $("#endDate").val();
}
},
我有一个 DataTable ajax 将值传递给控制器。请参阅下面的代码片段以获取我的简化代码。
$(function() {
$("#tableDiv").hide();
$("#submitDateFilters").on("click", function() {
displayData();
$("#tableDiv").show();
document.getElementById("dateFilters").reset();
});
});
////////////////////
// Table Header Contents
////////////////////
var tblReport = {};
var table;
var tableCont = {
"db_columns": [
"TYPE", "USER_ID", "USER_NAME", "DATE_ACCESS", "SESSION_ID", "PROJECT"
]
};
var obj = new Object();
////////////////////
// Create Table
////////////////////
function createTbl(wrapper) {
wrapper.empty();
wrapper.append(
$("<table/>").append($("<thead/>"), $("<tfoot/>"))
);
// row header
var row = $("<tr/>");
$.each(tableCont["db_columns"], function(i, val) {
row.append($("<th/>").text(val.replace(/\_/g, " ")));
});
$("table", wrapper).find("thead, tfoot").append(row);
return $("table", wrapper);
}
////////////////////
// Initialize Datatables
////////////////////
function displayData() {
var wrapper = $(".tbl-wrapper");
var dataObj = new Object();
dataObj.cols = tableCont["db_columns"];
var sDate = $("#startDate").val();
var eDate = $("#endDate").val();
if ($.isEmptyObject(tblReport)) {
//** create table
tblReport = createTbl(wrapper);
//** assign datatable columns
var columns = [];
$.each(tableCont["db_columns"], function(k, val) {
columns.push({
"data": val
});
});
//** initialize datatable
table = tblReport.DataTable({
"order": [
[3, "desc"]
],
"lengthMenu": [
[20, 50, 100, 200],
[20, 50, 100, 200]
],
"serverSide": true,
"processing": true,
"deferRender": true,
"destroy": true,
"ajax": {
"url": "getTableData",
"type": "POST",
"data": {
jsonData: JSON.stringify(dataObj),
startDate: sDate,
endDate: eDate
},
"cache": false
},
"columns": columns,
"columnDefs": [{
"data": undefined,
"defaultContent": "",
"targets": "_all"
}],
"drawCallback": function() {
//** re-adjust filters WIDTH
},
"initComplete": function() {
//** initialize COLUMN FILTERS
}
});
//** reload page on DATATABLE ERROR
$.fn.dataTable.ext.errMode = function(error) {
alert(error.toString());
//window.location.reload(true);
};
} else {
table.ajax.reload();
}
}
$("#startDate").datepicker({
maxDate: '0',
constrainInput: true,
changeYear: true,
changeMonth: true,
showOtherMonths: true,
selectOtherMonths: true,
onSelect: function(selectedDate) {
$("#endDate").datepicker("option", "minDate", selectedDate);
}
});
$("#endDate").datepicker({
maxDate: '0',
constrainInput: true,
changeYear: true,
changeMonth: true,
showOtherMonths: true,
selectOtherMonths: true,
onSelect: function(selectedDate) {
$("#startDate").datepicker("option", "maxDate", selectedDate);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.11/jquery.min.js"></script>
<div class="report-wrapper" align="center">
<div style="margin-bottom:5px;" align="center">
<form method="POST" action="getTableData" enctype="multipart/form-data" id="dateFilters">
<table>
<tr>
<td class="txt-bold"> FILTER DATE FROM: </td>
<td><input type="text" name="startDate" id="startDate" /></td>
<td class="txt-bold"> TO: </td>
<td style="padding-left:5px;"><input type="text" name="endDate" id="endDate" /></td>
<td><button type="button" id="submitDateFilters">Search</button></td>
</tr>
</table>
</form>
</div>
<div class="datatbl" style="width:1115px;" id="tableDiv"></div>
</div>
单击“搜索”按钮后,将调用函数 displayData(),并且 ajax 调用将发送一个请求。这对于第一次调用工作正常,但在接下来的按钮点击中,ajax 发送第一次调用的 startDate 和 endDate 值。
ajax/my 代码有什么问题,我该如何解决?
编辑:
我刚刚发现这是由我的脚本的 ajax.reload()
不工作引起的。我已将 DataTable 代码添加到代码段中。
ajax.data
选项使用函数而不是对象。并在调用函数时从 startDate 和 endDate 控件中检索数据。
如果您将对象用于 ajax.data
选项,您的代码将仅在初始化时被评估一次。如果您为 ajax.data
选项使用函数,则每次加载或重新加载 table 时都会调用它。
例如:
"ajax": {
"url": "getTableData",
"type": "POST",
"data": function ( d ) {
d.jsonData = JSON.stringify(dataObj);
d.startDate = $("#startDate").val();
d.endDate = $("#endDate").val();
}
},