Подтвердить что ты не робот

Перерисовать данные после использования 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);
    };
},
4b9b3361

Ответ 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] );
    }                                
}