У меня есть следующий бит кода, который отображается в модале начальной загрузки (если это актуально):
$(document).on('click', '.queued_auto_responders', function (event) {
if (table_queued_responders !== null) {
table_queued_responders.destroy();
}
// queued_ids from the clicked row
var customer_id = $(this).attr('data-customer-id');
$.ajax({
"type": "GET",
"url": "assets/php/get_automatic_responder.php",
"data": {"customer_id": customer_id},
"dataType": "json"
}).done(function(queued_emails) {
table_queued_responders = $('#queued_auto_responders').DataTable({
"data": queued_emails,
"columns": [
{ data: "queue_id", visible: false },
{ data: "send_date", title: 'Send Date' },
{ data: "title", title: "Title" },
{ data: "approved", visible: false },
{ data: "already_sent", visible: false },
{ data: null, title: 'Action', createdCell:
function (td, cellData, rowData, row, col) {
var button = $("<button />",
{
"class": "btn btn-outline-danger btn-block stop-queued-responder",
"text": "Stop Email",
"type": "button"
}).attr("data-queue-id", rowData.queue_id);
if (rowData.approved == 1 && rowData.already_sent == 0) {
$(td).html(button.prop("outerHTML"));
} else {
$(td).html("");
}
}
}
]
});
}).always(function() {
table_queued_responders.draw();
});
$('#queued_auto_responders').closest('.table-responsive').css('display', '');
});
Странно, что этот код действительно работает, но только в некоторых случаях,Иногда он отображает данные без каких-либо проблем, но иногда он не отображает данные и вместо этого отображает: "Не найдено подходящих записей." в теле, а затем "Отображение от 0 до 0 из 0 записей (отфильтровано из n записей) " где n - количество возвращенных записей.
Если я проверяю свою вкладку сети, я подтверждаю, что каждый раз возвращаются данные.
Кроме того, что происходит, если я нажимаю на элемент DOM, у которого есть .queued_auto_responders
, он открывает модальное окно и на короткое время хранит старые данные из предыдущего элемента DOM, прежде чем снова показывает сообщение. .
ОБНОВЛЕНИЕ
Согласно предложению Билала Ахмеда, я также попытался один раз инициализировать таблицу (вместо вызова уничтожения), удалить существующие строки и затем добавитьновые:
// upcoming auto-responder button click
var table_queued_responders = table_queued_responders = $('#queued_auto_responders').DataTable({
"columns": [
{ data: "queue_id", visible: false },
{ data: "send_date", title: 'Send Date' },
{ data: "title", title: "Title" },
{ data: "approved", visible: false },
{ data: "already_sent", visible: false },
{ data: null, title: 'Action', createdCell:
function (td, cellData, rowData, row, col) {
var button = $("<button />",
{
"class": "btn btn-outline-danger btn-block stop-queued-responder",
"text": "Stop Email",
"type": "button"
}).attr("data-queue-id", rowData.queue_id);
if (rowData.approved == 1 && rowData.already_sent == 0) {
$(td).html(button.prop("outerHTML"));
} else {
$(td).html("");
}
}
}
]
});
$(document).on('click', '.queued_auto_responders', function (event) {
table_queued_responders.rows().remove().draw();
// queued_ids from the clicked row
var customer_id = $(this).attr('data-customer-id');
$.ajax({
"type": "GET",
"url": "assets/php/get_automatic_responder.php",
"data": {"customer_id": customer_id},
"dataType": "json"
}).done(function(n) {
table_queued_responders.rows.add(n).draw();
});
$('#queued_auto_responders').closest('.table-responsive').css('display', '');
});
Такое же поведение происходит, за исключением отображения старых данных, теперь даже этого не происходит.
Обновление 2
Мне удалось заставить его работать, буквально просматривая ответ от вызова AJAX и вручную добавляя строки по одной. Я понятия не имею, почему он не работает при вызове rows.add
, но работает с row.add
.