(Калитка) Изменить видимость во время ответа AJAX - PullRequest
8 голосов
/ 05 февраля 2010

У меня есть AjaxPagingNavigator. В основном, при определенных условиях, список страниц AjaxPagingNavigator перезагружается. Когда это происходит, я хочу отображать навигатор только в том случае, если список содержит более 1 страницы.

Кто-нибудь знает, где я могу прикрепить обработчик, чтобы я мог проверить состояние видимости в моем AjaxPagingNavigator и включить / отключить видимость, чтобы при обновлении навигатора через. ajax это либо видно, либо нет?

Markup:

<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.

Ответы [ 2 ]

16 голосов
/ 18 марта 2011

Будьте осторожны при выполнении дорогостоящих вычислений в переопределенном методе isVisible, поскольку Wicket будет вызывать isVisible несколько раз за запрос, не считая вызовов, которые вы могли бы случайно сделать.

Как правило, лучший способ сделать это - переопределить onConfigure и установить флаг видимости вручную.

@Override
void onConfigure() {
    super.onConfigure();
    setVisible(isVisible() && someExpensiveToCalculateCondition);
}

onConfigure вызывается один раз во время обработки запроса и вызывается для всех компонентов, включая невидимые компоненты (в то время как onBeforeRender вызывается только для видимых компонентов).

1 голос
/ 05 февраля 2010

Прошло много времени с тех пор, как я коснулся Wicket, но если память не изменяет:

Не можете ли вы переопределить метод isVisible () вашего объекта "навигатор", чтобы он отображался только при желаемом условии?

например. что-то вроде

.addComponent(new AjaxPagingNavigator(...) {
  @Override public boolean isVisible() { 
    return model.getFound().size() > 25;
  }
});
...