(Калитка) Изменение видимости во время ответа 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.


person Dmitriy Likhten    schedule 05.02.2010    source источник


Ответы (2)


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

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

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

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

person Martijn Dashorst    schedule 18.03.2011
comment
Мне очень нравится этот ответ. Спасибо, что воскресили эту проблему в будущем :) - person Dmitriy Likhten; 19.03.2011
comment
+1 - Это было спасением (заслуживает двух голосов :). Но почему вызов isVisible в onConfigure? Используя пример Дмитрия, если первый ajax возвращает false для someExpensiveToCalculateCondition, а второй возвращает true, я полагаю, что isVisible будет ложным для всего выражения. - person Eduardo Costa; 10.08.2011
comment
Эдуардо, это, очевидно, зависит от варианта использования. Обычно isVisible() вызывается для учета изменений видимости где-то вверх по цепочке onConfigure. - person msp; 12.04.2013

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

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

например что-то типа

.addComponent(new AjaxPagingNavigator(...) {
  @Override public boolean isVisible() { 
    return model.getFound().size() > 25;
  }
});
person aw crud    schedule 05.02.2010
comment
Ха! Я чувствую себя таким глупым. Здесь я просматриваю все виды сумасшедшего поведения, чтобы прикрепить и настроить видимость. Ой! Кстати, return super.isVisible() && this.getPageable().getPageCount() › 1; вероятно, лучше, так как мы хотим убедиться, что если кто-то другой сделает нас невидимыми, мы уважаем это. - person Dmitriy Likhten; 05.02.2010
comment
Не чувствуйте себя глупо... когда я разрабатывал приложения Wicket, я обычно тратил много времени на поиск решений своих различных проблем, и когда я их находил, они почти всегда оказывались намного проще, чем я ожидал. - person aw crud; 05.02.2010
comment
Я поддержу это. Я думаю, что разработчики Wicket проделали большую работу, потому что обычно, когда я изучаю проблему, я понимаю, насколько легко было ее решить/исправить, и она была более интуитивно понятной, чем я думал. - person Matt; 08.02.2010
comment
Всегда следует устанавливатьVisible в onConfigure() по причинам, изложенным в ответе. - person Sarhanis; 01.12.2012
comment
Конечно. Как упоминает @Sarhanis, переопределение isVisible не рекомендуется гуру Wicket. Вместо этого переопределите onConfigure и управляйте видимостью оттуда. - person Stijn de Witt; 20.10.2014