(Калитка) Измените видимость во время ответа ajax
Вопрос
У меня есть AjaxPagingNavigator.В принципе, при определенном условии список страниц AjaxPagingNavigator перезагружается.Когда это происходит, я хочу отображать навигатор только тогда, когда список содержит более 1 страницы.
Итак, кто-нибудь знает, где я могу прикрепить обработчик, чтобы я мог проверять состояние видимости в моем AjaxPagingNavigator и включать / отключать видимость, чтобы при обновлении навигатора через.ajax это либо видно, либо нет?
Разметка:
<div wicket:id="mainWrap">
<div wicket:id="navigator"/>
<div wicket:id="listWrap">
<div wicket:id="list><!-- here be content --></div>
</div>
</div>
Итак, у меня есть событие ajax, которое обновляет "mainWrap", которое обновляет "навигатор" вместе со "списком" и оболочками.
это событие, которое запускает все это.
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
List foo = null; // do work to get list
model.setFound(found); // update the model (thus updating "list")
target.addComponent(mainWrap);
}
Редактировать:Я знаю, что могу писать
navigator.setVisibility(list.getPageCount() > 1);
после создания навигатора и после обновления модели, но я надеялся инкапсулировать это в подкласс AjaxPagingNavigator.
Решение
Будьте осторожны при выполнении дорогостоящих вычислений в переопределенном isVisible
метод, поскольку Wicket будет вызывать isVisible
несколько раз за запрос — не считая любых звонков, которые вы могли бы сделать непреднамеренно.
Как правило, лучший способ добиться этого - переопределить onConfigure
и установите флаг видимости вручную.
@Override
void onConfigure() {
super.onConfigure();
setVisible(isVisible() && someExpensiveToCalculateCondition);
}
onConfigure
вызывается только один раз во время обработки запроса и вызывается для всех компонентов, включая те, которые невидимы (пока onBeforeRender
вызывается только для видимых компонентов).
Другие советы
Прошло много времени с тех пор, как я прикасался к Калитке, но, если мне не изменяет память:
Можете ли вы не переопределять метод isVisible() вашего объекта "navigator" таким образом, чтобы он отображался только при том условии, которое вы желаете?
например ,что - то вроде
.addComponent(new AjaxPagingNavigator(...) {
@Override public boolean isVisible() {
return model.getFound().size() > 25;
}
});