Вызов 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();