Довольно часто я использую пользовательские компоненты Wicket для рендеринга объектов модели.Объекты могут иногда быть нулевыми, в этом случае отображается определенный div.В коде рендеринга компонента HTML, таким образом, у меня есть два элемента div, один для случая «null» и один для случая «non-null», с другой внутренней разметкой.Один отображается, в то время как другой маскируется.
<div wicket:id="toDisplayWhenObjectIsNull">
...
</div>
<div wicket:id="toDisplayWhenObjectIsNotNull">
<span wicket:id="label">...</span>
<table wicket:id="table">...</table>
...
</div>
Проблема, с которой я сталкиваюсь, заключается в том, что Wicket заставляет меня полностью построить два div, даже если объект модели нулевой.Во всех вызовах к построению подкомпонентов (метки, таблицы и т. Д.) Я должен проверять на нулевое значение, что является громоздким и подверженным ошибкам:
X myX = getModel().getModelObject();
Label label = new Label("label",
myX == null ? null : formatY(myX.getY()));
Первое решение этого было быразделить ненулевую часть на определенный подкомпонент калитки, либо как собственный класс, либо как внутренний класс главного компонента;и вставив этот компонент вместо "ненулевого" div.Но это удваивает количество необходимых файлов (ресурсы, HTML, код Java).Это не идеально.
Второе решение, универсальное, состояло бы в том, чтобы создать компонент «декоратор» для инкапсуляции любого другого компонента и проверки на нулевое значение в его объекте модели.Если компонент имеет значение null, он будет отображать стандартный div, а если нет, он будет полагаться на декорированный компонент.Я пытался реализовать это с помощью рамок или составных панелей, но мне не удалось заставить его работать.Я хотел бы добиться чего-то вроде этого:
// Client code, Java
ViewXPanel xpanel = new ViewXPanel("xpanel", new Model<X>(x));
add(xpanel);
// HTML
<div wicket:id="xpanel"/>
ИЛИ, если необходимо, возложить на клиента ответственность за «обнуляемость» отображаемого компонента, используя что-то вроде этого в коде клиента:
// Client code, Java
ViewXPanel xpanel = new NullableDecorator(?, ViewXPanel(...));
add(xpanel);