【发布时间】:2017-05-23 18:00:06
【问题描述】:
我的页面上有一个 jquery 数据表。该数据表将根据对我的 api 提出的请求显示数据
我拥有的 HTML 如下所示:
<table id="details" class="table table-bordered table-hover table-striped nowrap hidden display" cellspacing="0" width="100%">
<thead>
<tr>
<th> </th>
<th>Patient Full Name</th>
<th class="hidden">LF</th>
</tr>
</thead>
<tfoot>
<tr>
<th> </th>
<th>Patient Full Name</th>
<th class="hidden">LF</th>
</tr>
</tfoot>
<tbody>
<tr id="dummytr2"><td style="text-align:center;padding-top:20px;" colspan="7"><p><em>No Data Available</em></p></td></tr>
</tbody>
</table>
第一个<th>将用于折叠tr并获取该患者的设施(第三个<th>或隐藏的)。
我在表中有一个虚拟 <tr>,因为我不想在开始时初始化数据表,所以我没有收到告诉我无法两次初始化数据表的错误消息。
对我的 api 的请求将通过一堆按钮触发,如下所示:
$.ajax({
url: "https://" + window.myLocalVar + "/api/metrics/GetDetails?metricName=" + metric,
type: "GET",
dataType: 'json',
contentType: 'application/json',
success: function (requests) {
if (requests.length > 0) {
$("#dummytr2").remove();
for (var i = 0; i < requests.length; i++) {
var patient_name = requests[i].PatientFullName;
var lab_facility = requests[i].LabFacility;
tr = '<tr>\
<td class=" details-control"></td>\
<td>' + patient_name + '</td>\
<td class="hidden">' + lab_facility + '</td>\
</tr>';
$("#details > tbody").append(tr);
//click event for each tr
$('#details tbody').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
// This row is already open - close it
row.child.hide();
tr.removeClass('shown');
} else {
// Open this row
row.child(format(row.data())).show();
tr.addClass('shown');
}
});
}
}
// NOT SURE WHY IT IS NOT WORKING
$('#details').dataTable().fnDestroy();
var table = $('#details').DataTable({
"scrollX": true,
stateSave: true,
"columns": [
{
"className": 'details-control',
"orderable": false,
"data": null,
"defaultContent": ''
},
{ "data": "PatientFullName" },
{ "data": "LabFacility" }
],
"order": [[1, 'asc']]
});
},
error: function (err) {
if (err) {
console.log(err);
}
}
});
});
function format(d) {
// `d` is the original data object for the row
var lf = d.LabFacility;
if (lf == "") {
lf = "No Lab Facility"
}
// wrapping text is not working???
return '<div class="table-responsive"><table class="table display" cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">' +
'<tr>' +
'<td>Lab Facility:</td>' +
'<td>' + lf + '</td>' +
'</tr>' +
'</table></div>';
}
每次单击按钮时都会调用此 ajax 请求。这意味着每次单击按钮时,我的数据表的内容都会发生变化。我试图清除并重新填充它不起作用..我试图销毁它..它不起作用..每次我销毁我的数据表并执行脚本时它都不会改变表的内容。
我不确定我的代码有什么问题。我的代码仅在第一次时有效。第二次单击按钮时,它不会更新我的数据表。
谢谢!
【问题讨论】:
-
尝试在你的ajax请求之外设置dataTable,每次你调用你的ajax请求来获取新数据时,只需清空datatable对象,添加新行,然后重新绘制,而不是每次发出 ajax 请求时尝试初始化 dataTable。对您的点击事件处理程序执行相同操作,在 ajax 请求成功方法之外进行设置。
-
您好,您可以使用Datatable 中的ajax 选项。并且每次你想刷新你都可以使用
table.api().ajax.reload(); -
@dnviveros,我尝试使用 $('#details').dataTable().api().ajax.reload();而不是 $('#details').dataTable().fnDestroy();但它说无效的json响应。您能否提供添加该命令的正确位置
-
@Woodrow 我试过那个方法,但没用
-
抱歉,我的意思是,您必须停止使用“普通 ajax”,而只使用 dataTable ajax,例如:
$('#example').dataTable( { "ajax": { "url": "data.json", "data": function ( d ) { d.search = $('#search').val(); } } } );
标签: javascript jquery datatables