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

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

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

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

Проблема в том, что таблица данных возвращается на первую страницу записей после удаления пользователя.Например, если я нахожусь на странице 5 моей таблицы данных, на странице UserList, и я нажимаю удалить, она останется на странице 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 ]

2 голосов
/ 28 марта 2013

Рекомендуется сохранять плагин 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();
}; 

в Java:

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

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

0 голосов
/ 28 марта 2013

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

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

var dt = $("#table").dataTable();
dt.fnStandingRedraw();
...