Калитка:Условное отображение в шаблоне
Вопрос
Hy, я хочу отобразить определенную часть (например, Div) моего калитки только при определенном условии (например, только в том случае, если у меня есть данные, чтобы заполнить его).Проблема в:
Если я добавляю панель (заполняя div), только если я получил данные, исключение выдается каждый раз, когда я вызываю страницу без данных (поскольку указанный идентификатор калитки не добавляется в дерево компонентов).
Единственное решение, которое пришло мне в голову, — добавить пустую панель, если данных нет.Это не идеальное решение, потому что у меня есть ненужный код в Java-коде и много пустых разделов в моем визуализированном HTML.
Так есть ли лучшее решение включать несколько частей шаблона калитки только при условии?
Решение
Хотя это старый вопрос, здесь может быть еще одно решение: калитка: корпус (и этот )
Обновлять:Теперь мне самому понадобилась эта функциональность (для реактивный самолет).Я использую 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 в помеченной строке //##, и я думаю, что в этом случае функция заключения калитки выглядела бы для меня более уродливой.
Другие советы
Как сказал @miaubiz, вы можете вызвать setVisible(false) или переопределить метод isVisible(), если видимость обусловлена каким-либо другим состоянием (например, заполненными полями).
Да, вы хотите переопределить isVisible.Это предотвратит рендеринг HTML-разметки isVisible=false даже на конечной HTML-странице.Кроме того, согласно документам (упомянутым в Пустая панель), вы можете использовать Веб-маркупконтейнер в качестве компонента упаковки.
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(); }
};
Я думаю, именно поэтому есть Пустая панель.Не зная больше о вашем коде, я могу только сказать, что то, что, по моему мнению, вы делаете, я бы сделал с комбинацией какого-нибудь дочернего элемента АннотацияРепитер и Фрагмент.Если вы хотите рассказать больше о том, что вы хотите сделать, и, возможно, предоставить некоторый код, я буду рад помочь, насколько смогу.
вы можете вызвать setVisible(false);на компоненте, который вы хотите скрыть.