Какова наилучшая стратегия для условного отображения нескольких элементов (например, списка полей, зависящих от значения бина)?
Возможные решения, о которых я подумал:
- JSTL
<c:if ... >
предложение. Из чего я
понять, используя JSTL с JSF
обескуражен
- Использование «рендеринга»
атрибут большинства компонентов.
К сожалению, когда мне приходится иметь дело
с большим количеством полей становится
неуклюжий, чтобы установить их на каждом ...
- Размещение элементов на контейнере
и установка отображаемого атрибута
на контейнере
Вариант 3 кажется наиболее разумным, но я не знаю, какой компонент использовать для обтекания этих полей. Это должен быть компонент, который не влияет на макет ...
Я мог бы использовать span в качестве оболочки и установить видимое свойство CSS, но поля все равно будут отображаться, просто невидимые.
Есть мысли?
Обновление:
Вот некоторый фактический код макета. Я пробовал оба <h:panelGroup>
& <ui:fragment>
. Использование любого из этих тегов поместит все мои поля в один <td>
, что, я признаю, имеет смысл, потому что я помещаю один элемент верхнего уровня в свой panelGrid
.
Единственное, что работает так, как я хочу, это # 2 из списка выше.
<h:panelGrid columns="2">
<!-- fields if person -->
<ui:fragment rendered="#{createEntity.entityType eq 'fizica'}">
<h:outputLabel value="Prenume: " />
<h:inputText value="#{createEntity.person.firstName}" />
<h:outputLabel value="Nume familie: " />
<h:inputText value="#{createEntity.person.familyName}" />
<h:outputLabel value="CNP: " />
<h:inputText value="#{createEntity.person.cnp}" />
<h:outputLabel value="Date carte identitate: " />
<h:inputText value="#{createEntity.person.idCardInfo}" />
<h:outputLabel value="Cetatenie: " />
<h:inputText value="#{createEntity.person.country}" />
</ui:fragment>
<!-- fields for company -->
<ui:fragment rendered="#{createEntity.entityType eq 'juridica'}">
<h:outputLabel value="Denumire firma" />
<h:inputText value="#{createEntity.company.name}" />
<h:outputLabel value="CUI" />
<h:inputText value="#{createEntity.company.cui}" />
<h:outputLabel value="Registrul Comertului" />
<h:inputText value="#{createEntity.company.regCommerceNo}" />
</ui:fragment>
</h:panelGrid>