Вызов fnStandingRedraw для сохранения текущих настроек пагинации в таблицах данных с использованием javaScriptSupport.addInitializerCall

Я использую метод CreateEventLink класса ComponentResources для создания ссылки на событие удаления на моей странице под названием UserList с использованием следующего:

resources.createEventLink("delete", user.getUserId()).toURI();

Страница UserList использует таблицы данных для создания списка данных пользователя и ссылки для удаления. При нажатии на ссылку удаления вызывается событие удаления на той же странице, и все счастливы.

Проблема в том, что таблица данных возвращается на первую страницу записей после удаления пользователя. Например, если я нахожусь на странице 5 моей таблицы данных, на странице UserList, и я нажимаю кнопку удаления, она останется на странице списка пользователей, но моя таблица данных сбрасывается на первую страницу.

После некоторых исследований я обнаружил, что плагин fnStandingRedraw из datatables исправит эту проблему: http://datatables.net/plug-ins/api

Просматривая документацию, я узнал, что должен использовать:

 javaScriptSupport.addInitializerCall("fnStandingRedraw", ""); 

для вызова следующего в файл js через нотацию импорта:

Tapestry.Initializer.fnStandingRedraw = function(oSettings) { 
    //redraw to account for filtering and sorting 
    // concept here is that (for client side) there is a row got inserted at the end (for an add) 
    // or when a record was modified it could be in the middle of the table 
    // that is probably not supposed to be there - due to filtering / sorting 
    // so we need to re process filtering and sorting 
    // BUT - if it is server side - then this should be handled by the server - so skip this step 
    if(oSettings.oFeatures.bServerSide === false){ 
        var before = oSettings._iDisplayStart; 
        oSettings.oApi._fnReDraw(oSettings); 
        //iDisplayStart has been reset to zero - so lets change it back 
        oSettings._iDisplayStart = before; 
        oSettings.oApi._fnCalculateEnd(oSettings); 
    } 

    //draw the 'current' page 
    oSettings.oApi._fnDraw(oSettings); 
}; 

Однако я получаю ошибку:

Uncaught TypeError: Cannot read property 'bServerSide' of undefined 
Tapestry.Initializer.fnStandingRedrawhelpdesk.js:16 
$.extend.inittapestry-jquery.js:32 
jQuery.extend.eachjquery-1.6.2.js:655 
$.extend.inittapestry-jquery.js:26 
jQuery.extend.eachjquery-1.6.2.js:649 
$.extend.inittapestry-jquery.js:18 
(anonymous function)list:70 
jQuery.extend._Deferred.deferred.resolveWithjquery-1.6.2.js:1008 
jQuery.extend.readyjquery-1.6.2.js:436 
DOMContentLoadedjquery-1.6.2.js:915 

Любое руководство будет наиболее ценно... Спасибо заранее!

2 ответа

Решение

Лучше всего сохранять плагин DataTables в отдельном js-файле, чтобы вы могли использовать его не только через инициализатор гобеленов, но и из других js.

(function($) {
    $.fn.dataTableExt.oApi.fnStandingRedraw = function(oSettings) {
        if(oSettings.oFeatures.bServerSide === false){
            var before = oSettings._iDisplayStart;

            oSettings.oApi._fnReDraw(oSettings);

            // iDisplayStart has been reset to zero - so lets change it back
            oSettings._iDisplayStart = before;
            oSettings.oApi._fnCalculateEnd(oSettings);
        }

        // draw the 'current' page
        oSettings.oApi._fnDraw(oSettings);
    };
})(window.jQuery);

Таким образом, вы можете использовать его из других мест, как:

var oTable = $('.dataTable').dataTable();
oTable.fnStandingRedraw();

Звонить fnStandingRedraw() из гобелена:

jsSupport.addScript("$(%s).dataTable().fnStandingRedraw()", "#myTable");

или вы можете добавить инициализатор гобелена и вызвать его:

Tapestry.Initializer.standingRedraw = function(spec) { 
    $(spec.tableId).dataTable().fnStandingRedraw();
}; 

в яве:

jsSupport.addInitializerCall("standingRedraw", 
    new JSONObject("tableId", "#myTable"));

Но это будет работать для вас, только если ваш DataTable находится на стороне клиента (разбиение на страницы, сортировка, фильтрация) и вы делаете ajax-запрос на удаление строки и удаление этой строки из DataTable вручную из js.

У вас нет oSettings объект.

Вы можете вызвать его из объекта dataTable (который имеет oSettings):

var dt = $("#table").dataTable();
dt.fnStandingRedraw();
Другие вопросы по тегам