Калитка: условное отображение в шаблоне - PullRequest
8 голосов
/ 07 августа 2009

Hy, Я хочу отобразить определенную часть (например, div) моего шаблона wicket только при определенных условиях (например, только если у меня есть данные для его заполнения). Проблема:

Если я добавляю панель (заполняя div) только тогда, когда получаю данные, то исключение выдается каждый раз, когда я вызываю страницу без данных (поскольку ссылочный идентификатор wicket не добавляется в дерево компонентов).

Единственное решение, которое мне пришло в голову, это добавить пустую панель, если данных нет. Это не идеальное решение, потому что я получил некоторый ненужный код в java-коде и много пустых div-ов в моем отрисованном html.

Так есть ли лучшее решение включить несколько частей шаблона калитки только при условии?

Ответы [ 5 ]

4 голосов
/ 01 августа 2010

Хотя это старый вопрос, здесь может быть еще одно решение: калитка: enclosure this )

Обновление : Теперь мне понадобилась эта функция самостоятельно (для jetwick ). Я использую WebMarkupContainer один для состояния loggedIn и один для состояния loggedOut и устанавливаю правильную видимость:

if (loggedIn()) {            
   WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn");
   //## do something with the user
   User user = getUserSomeWhere();
   loggedInContainer.add(new UserSearchLink("userSearchLink"));
   add(loggedInContainer);
   add(WebMarkupContainer("loggedOut").setVisible(false));
} else {
   add(new WebMarkupContainer("loggedIn").setVisible(false));
   WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut");
   loggedOutContainer.add(new LoginLink() {...});
   add(loggedOutContainer);
}

Преимущество этого для меня в том, что я предотвращаю NullpointerExc в отмеченной // ## строке, и в этом случае мне кажется, что функция включения wicket будет выглядеть для меня более уродливо.

3 голосов
/ 22 сентября 2009

Как сказал @miaubiz, вы можете вызвать setVisible (false) или переопределить метод isVisible (), если видимость зависит от какого-то другого состояния (например, поля заполнены).

2 голосов
/ 04 мая 2010

Да, вы хотите переопределить isVisible. Это предотвратит рендеринг разметки isVisible = false в html даже на последнюю html-страницу. Кроме того, в соответствии с документами (упомянутыми в EmptyPanel ), вы можете использовать WebMarkupContainer в качестве компонента упаковки.

    this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){
        private static final long serialVersionUID = 1L;

        @Override
        public boolean isVisible() { return myList.isEmpty(); } 
    });

    final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){
        private static final long serialVersionUID = 1L;

        @Override
        public boolean isVisible() { return !myList.isEmpty(); } 
    };
1 голос
/ 08 августа 2009

Наверное, поэтому есть Пустая панель . Не зная о вашем коде больше, я могу только сказать, что то, что я думаю, вы делаете, это то, что я бы сделал с комбинацией некоторого потомка AbstractRepeater и Fragment . Если вы хотите рассказать больше о том, что вы хотите сделать, и, возможно, также предоставить какой-то код, я буду рад помочь вам, насколько смогу.

0 голосов
/ 09 сентября 2009

Вы можете вызвать setVisible (false); на компоненте, который вы хотите скрыть.

...