Перерисовать данные после использования ajax для обновления содержимого таблицы?
Я использую Datatables и на кнопке на странице, которая обновляет таблицу с помощью AJAX. Чтобы быть ясным, таблица не использует источник данных ajax, мы просто используем ajax для обновления только тогда, когда это необходимо. Ajax обновляет div, в который заключена таблица. Я знаю, что теряю свои кнопки разбиения на страницы и возможности фильтрации, потому что таблица нужно перерисовать, но я не уверен, как добавить это в код инициализации таблицы.
Код Datatables
var oTable6;
$(document).ready(function() {
oTable6 = $('#rankings').dataTable( {
"sDom":'t<"bottom"filp><"clear">',
"bAutoWidth": false,
"sPaginationType": "full_numbers",
"aoColumns": [
{ "bSortable": false, "sWidth": "10px" },
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
]
});
});
Код ajax - это
$("#ajaxchange").click(function(){
var campaign_id = $("#campaigns_id").val();
var fromDate = $("#from").val();
var toDate = $("#to").val();
var url = 'http://domain.com/account/campaign/ajaxrefreshgrid?format=html';
$.post(url, { campaignId: campaign_id, fromdate: fromDate, todate: toDate},
function( data ) {
$("#ajaxresponse").html(data);
});
});
Я пробовал это, но это не сработало
"fnDrawCallback": function() {
function( data ) {
$("#ajaxresponse").html(data);
};
},
Ответы
Ответ 1
Похоже, вы можете использовать функции API для
- очистить таблицу (fnClearTable)
- добавить новые данные в таблицу (fnAddData)
- перерисовать таблицу (fnDraw)
http://datatables.net/api
UPDATE
Я думаю, вы используете DOM Data Source (для обработки на стороне сервера) для создания вашей таблицы. Сначала я этого не понял, поэтому мой предыдущий ответ не будет работать для этого.
Чтобы заставить его работать без перезаписи кода на стороне сервера:
Что вам нужно сделать, это полностью удалить старую таблицу (в dom) и заменить ее содержимым результата ajax, а затем повторно инициализировать datatable:
// in your $.post callback:
function (data) {
// remove the old table
$("#ajaxresponse").children().remove();
// replace with the new table
$("#ajaxresponse").html(data);
// reinitialize the datatable
$('#rankings').dataTable( {
"sDom":'t<"bottom"filp><"clear">',
"bAutoWidth": false,
"sPaginationType": "full_numbers",
"aoColumns": [
{ "bSortable": false, "sWidth": "10px" },
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
]
}
);
}
Ответ 2
Попробуйте уничтожить datatable с помощью bDestroy: true:
$("#ajaxchange").click(function(){
var campaign_id = $("#campaigns_id").val();
var fromDate = $("#from").val();
var toDate = $("#to").val();
var url = 'http://domain.com/account/campaign/ajaxrefreshgrid?format=html';
$.post(url, { campaignId: campaign_id, fromdate: fromDate, todate: toDate},
function( data ) {
$("#ajaxresponse").html(data);
oTable6 = $('#rankings').dataTable( {"bDestroy":true,
"sDom":'t<"bottom"filp><"clear">',
"bAutoWidth": false,
"sPaginationType": "full_numbers",
"aoColumns": [
{ "bSortable": false, "sWidth": "10px" },
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
]
}
);
});
});
bDestroy: true сначала уничтожит и datatable экземпляр, связанный с этим селектором, перед повторной инициализацией нового.
Ответ 3
Я не уверен, почему. Но
oTable6.fnDraw();
Работает для меня. Я помещаю его в следующую строку.
Ответ 4
Используйте это:
var table = $(selector).dataTables();
table.api().draw(false);
или
var table = $(selector).DataTables();
table.draw(false);
Ответ 5
Для пользователей современных DataTables (1.10 и выше) все ответы и примеры на этой странице предназначены для старого api, а не нового. Мне было очень сложно найти более новый пример, но, наконец, найти этот пост форума DT (TL; DR для большинства людей), что привело меня к этот краткий пример.
Пример кода работал у меня после того, как я наконец заметил синтаксис синтаксиса $(), непосредственно окружающий строку html. Вы должны добавить node не строку.
Этот пример действительно стоит посмотреть, но в духе SO, если вы просто хотите увидеть фрагмент кода, который работает:
var table = $('#example').DataTable();
table.rows.add( $(
'<tr>'+
' <td>Tiger Nixon</td>'+
' <td>System Architect</td>'+
' <td>Edinburgh</td>'+
' <td>61</td>'+
' <td>2011/04/25</td>'+
' <td>$3,120</td>'+
'</tr>'
) ).draw();
Тщательный читатель может заметить, что, поскольку мы добавляем только одну строку данных, table.row.add(...) должен работать так же, как и для меня.
Ответ 6
Это работает для меня
var dataTable = $('#HelpdeskOverview').dataTable();
var oSettings = dataTable.fnSettings();
dataTable.fnClearTable(this);
for (var i=0; i<json.aaData.length; i++)
{
dataTable.oApi._fnAddData(oSettings, json.aaData[i]);
}
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
dataTable.fnDraw();
Ответ 7
При инициализации используйте:
"fnServerData": function ( sSource, aoData, fnCallback ) {
//* Add some extra data to the sender *
newData = aoData;
newData.push({ "name": "key", "value": $('#value').val() });
$.getJSON( sSource, newData, function (json) {
//* Do whatever additional processing you want on the callback, then tell DataTables *
fnCallback(json);
} );
},
И тогда просто используйте:
$("#table_id").dataTable().fnDraw();
Важная вещь в файле fnServerData:
newData = aoData;
newData.push({ "name": "key", "value": $('#value').val() });
Если вы нажмете прямо на aoData, изменение будет первичным при первом рисовании таблицы, а fnDraw не будет работать так, как вы хотите.
Ответ 8
Вот как я кормлю свою таблицу данными, полученными ajax (не уверен, что это лучшая практика, но она чувствует себя интуитивно понятной и хорошо работает):
/* initialise table */
oTable1 = $( '.tables table' ).dataTable
( {
'sPaginationType': 'full_numbers',
'bLengthChange': false,
'aaData': [],
'aoColumns': [{"sTitle": "Tables"}],
'bAutoWidth': true
} );
/*retrieve data*/
function getArr( conf_csv_path )
{
$.ajax
({
url : 'my_url'
success : function( obj )
{
update_table( obj );
}
});
}
/* build table data */
function update_table( arr )
{
oTable1.fnClearTable();
for ( input in arr )
{
oTable1.fnAddData( [ arr[input] );
}
}