условное отображение для нескольких полей - JSF 2.0 / Primefaces - PullRequest
2 голосов
/ 08 апреля 2011

Какова наилучшая стратегия для условного отображения нескольких элементов (например, списка полей, зависящих от значения бина)?

Возможные решения, о которых я подумал:

  1. JSTL <c:if ... > предложение. Из чего я понять, используя JSTL с JSF обескуражен
  2. Использование «рендеринга» атрибут большинства компонентов. К сожалению, когда мне приходится иметь дело с большим количеством полей становится неуклюжий, чтобы установить их на каждом ...
  3. Размещение элементов на контейнере и установка отображаемого атрибута на контейнере

Вариант 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>  

Ответы [ 5 ]

6 голосов
/ 08 апреля 2011

Rendered - рекомендуемый способ отображения (или нет) компонента.

Если вы можете сгруппировать их вместе, то установка атрибута Rendered для контейнера будет абсолютно корректной.Я бы сделал это в предпочтении установки атрибута рендеринга для каждого отдельного компонента.

Единственным незначительным недостатком является то, что отображение является динамическим (вы изменяете значение базового компонента), и вам необходимо повторно отобразить контейнер,это не существуетВам нужно обернуть контейнер в другой контейнер, который вы затем повторно запустите.

2 голосов
/ 08 апреля 2011

Вы можете использовать h:panelGroup в качестве контейнера для этого. У него есть свойство рендеринга, и в результате получится span (по умолчанию).

1 голос
/ 27 марта 2014

Мне пришлось прибегнуть к использованию, потому что, когда я обернул значения моего столбца в другом компоненте (например, ui: фрагмент или h: panelGroup), чтобы использовать визуализированный для этого компонента, panelGrid обработал весь фрагмент пользовательского интерфейса как один столбец, который действительно испортил до моего стола.

<c:if test="#{myBean.displayThese}">
   <!-- columns to display for this condition -->
</c:if>
<c:if test="#{!myBean.displayThese}">
   <!-- other stuff to display -->
</c:if>

удивительно, но <c:otherwise>, похоже, не работает для меня.

0 голосов
/ 15 июня 2016

если вы запрашиваете условие со значением вашей переменной вашей базы данных:

<c:if test="#{myObject.mycolumnTableDB==value1}">
   <!-- columns to display for this condition -->
</c:if>
<c:if test="#{myObject.mycolumnTableDB==value2}">
   <!-- other stuff to display -->
</c:if>
0 голосов
/ 08 мая 2015

некрасиво, но, возможно, работает на вас, используя условный стиль:

<h:component value="foo" style="#{!myBean.displayFoo ? 'display: none;' : ''}" />
...