我正在使用带有Grails应用程序的DataTables 1.10.10。该表通过ajax调用填充到REST端点。
当一切正常时,请求返回200级状态代码,一切都很好。我们试图优雅地处理另一端系统出现问题的时候,在这种情况下它会向我们发送一个400的代码和一个空体。
我在datatables文档中找不到任何关于如何陷阱状态代码的结论。我发现的是一个开箱即用的DT不能处理非200码的页面,并会显示错误。
https://datatables.net/manual/tech-notes/7
但是,我似乎无法做到这一点。当我的模拟抛出400级错误并传递一个空的json数组时,该表会重新绘制一条永不消失的“处理”消息。
我喜欢是一种捕获400级错误的方法,允许表显示“表中没有数据”,而且在回调函数中能够解释为什么没有数据,通过向页面写入引导通知或其他内容。
有关如何使用DataTables捕获非200级状态代码的任何建议吗?
function redrawResults(){
resultsTable.destroy();
resultsTable = $('#displayTable').DataTable({
"dom": '<"toolbar">Bfrtip',
"buttons": [
{
extend: 'pdf',
text: 'Save Table as PDF',
filename: "Redacted " + $('#search_text').val(),
className: 'btn btn-primary',
orientation: 'landscape',
exportOptions: {
columns: [':visible',9,10 ]
}
},
{
extend: 'csv',
text: 'Export to CSV',
filename: "Redacted " + $('#search_text').val(),
className: 'btn btn-primary',
exportOptions: {
columns: [':visible',9,10 ]
}
}],
order: [[2, "asc"], [0, "asc"]],
drawCallback: function (settings) {
var api = this.api();
var rows = api.rows({page: 'current'}).nodes();
var last = null;
api.column(2, {page: 'current'}).data().each(function (group, i) {
var groupInfo = group.split("~");
var checkRedacted;
var deleteControls;
checkRedacted = (groupInfo[2] == "true") ? "groupRedacted" : "group";
deleteControls = (groupInfo[2] == "true") ? "<B>REDACTED</B>" : buildButtonGroup('Delete package from collection', 'Redact',groupInfo[0],groupInfo[3]);
if (last !== group) {
$(rows).eq(i).before(
//Note - the extra, empty TD is to force the responsive child row control to be invisible for group rows
'<tr class="' + checkRedacted + '"><td class="hidden"></td><td colspan="9">' + "<B>Package ID: </B>" + groupInfo[0] + ', <B>Hash: </B>' + groupInfo[1] + '<div class="pull-right">' + deleteControls + '</div></td></tr>'
);
last = group;
}
});
},
ajax: {
url: ajaxSource,
data: {
searchText: $('#search_text').val()
},
dataSrc: function (json) {
var return_data = new Array();
for (var i = 0; i < json.data.length; i++) {
for (var x = 0; x < json.data[i].events.length; x++) {
Object.keys(json.data[i].events[x]).forEach(function (keyValue) {
if (keyValue != "collections") {
var statusMsg = "n/a";
var statusText = "n/a";
if ("status" in json.data[i].events[x][keyValue] &&
json.data[i].events[x][keyValue]["status"] != null) {
statusText = json.data[i].events[x][keyValue]["status"];
//if there's also a status message, include it, n/a as a default
if (json.data[i].events[x][keyValue].status_message != null){
statusMsg = json.data[i].events[x][keyValue].status_message
}
}
return_data.push({
"package_id": json.data[i].package_id + "~" + json.data[i].hash + "~" + json.data[i].redacted + "~" + json.data[i].collections,
"collections": json.data[i].collections,
"event_type": keyValue,
"message_type": json.data[i].events[x][keyValue].message_type,
"occurred": json.data[i].events[x][keyValue].occurred,
"from": json.data[i].events[x][keyValue].sent_from,
"to": json.data[i].events[x][keyValue].sent_to,
"event_collections": json.data[i].events[x].collections,
"status": statusText,
"statusMsg": statusMsg,
"package_id_export":json.data[i].flare_package_id,
"hash":buildSpaceDelimitedHash(json.data[i].stix_hash)
})
}
})
}
}
return return_data;
}
}
,
responsive: true,
columnDefs: [
{
data: "occurred",
targets: 0,
orderData: [2, 0]
},
{
data: "event_collections",
targets: 1,
orderData: [2, 1]
},
{
data: "package_id",
"visible": false,
targets: 2
},
{
data: "event_type",
targets: 3,
orderData: [2, 3]
},
{
data: "message_type",
targets: 4,
orderData: [2, 4]
},
{
data: "from",
targets: 5,
orderData: [2, 5]
},
{
data: "to",
targets: 6,
orderData: [2, 6]
},
{
data: "status",
targets: 7,
orderData: [2, 7]
},
{
data: "statusMsg",
targets: 8,
orderData: [2, 8]
},
{
data: "package_id_export",
"visible": false,
targets: 9
},
{
data: "hash",
"visible": false,
targets: 10
}
]
});
}