Как условно отобразить тег f: selectItem? - PullRequest
38 голосов
/ 03 августа 2011

Как указать условный рендеринг для тега <f:selectItem>.Мне нужно отобразить параметры <f:selectItem> в зависимости от статуса конкретного пользователя.

Например, я хотел что-то вроде:

<f:selectItem itemLabel="Yes! I need a girlfriend!"
             rendered="false(or some boolean condition)"
             itemValue="o1"/>

Ответы [ 7 ]

64 голосов
/ 03 августа 2011

<f:selectItem> не не поддерживает атрибут rendered.Ваша ближайшая ставка - атрибут itemDisabled, который по-прежнему отображает предмет, но делает его недоступным для выбора.Это также поддерживается в <f:selectItems>.

. В случае <p:selectOneMenu> вы можете просто добавить CSS для скрытия отключенных элементов.

<p:selectOneMenu ... panelStyleClass="hideDisabled">
    <f:selectItem itemValue="1" itemLabel="one" />
    <f:selectItem itemValue="2" itemLabel="two" itemDisabled="#{some.condition}" />
    <f:selectItem itemValue="3" itemLabel="three" />
</p:selectOneMenu>
.ui-selectonemenu-panel.hideDisabled .ui-selectonemenu-item.ui-state-disabled {
    display: none;
}

В случае <h:selectOneMenu> Вы в большей степени зависите от того, поддерживает ли веб-браузер скрытие отключенных параметров с помощью CSS:

<h:selectOneMenu ... styleClass="hideDisabled">
    <f:selectItem itemValue="1" itemLabel="one" />
    <f:selectItem itemValue="2" itemLabel="two" itemDisabled="#{some.condition}" />
    <f:selectItem itemValue="3" itemLabel="three" />
</h:selectOneMenu>
select.hideDisabled option[disabled] {
    display: none;
}

Альтернативой на стороне сервера является введение JSTL <c:if> вокруг отдельного <f:selectItem> дляусловно добавьте его в представление следующим образом (убедитесь, что вы знаете, как работает JSTL в JSF: JSTL в JSF2 Facelets ... имеет смысл? ):

<f:selectItem itemValue="1" itemLabel="one" />
<c:if test="#{not some.condition}">
    <f:selectItem itemValue="2" itemLabel="two"  />
</c:if>
<f:selectItem itemValue="3" itemLabel="three" />

ИлиВы можете просто динамически заполнить List<SelectItem> в компоненте поддержки на основе вычисленных условий и связать его с <f:selectItems>.

6 голосов
/ 09 мая 2012

Обходной путь, который я использую, устанавливает атрибут itemDisabled и использует этот CSS:

select option[disabled] { display: none; }

Но это должно быть исправлено в JSF.

3 голосов
/ 27 февраля 2015

Вы можете обернуть его в ui:fragment код:

<ui:fragment rendered="false(or some boolean condition)">
  <f:selectItem itemLabel="Yes! I need a girlfriend!" itemValue="o1"/>
</ui:fragment>

Тогда элемент будет отображаться только тогда, когда булево кодирование истинно.

3 голосов
/ 18 февраля 2012

<c:if> для меня также не работает, если это зависит от повторяющейся переменной компонента `(на первом этапе сборки он работает, но с использованием ajax и обновляет коллекцию для каждого, он терпит неудачу, показывая некоторые элементы дважды идругие нет)

это действительно одна большая проблема в JSF.Отключение - это не всегда вариант, и таким образом в компоненте требуется гораздо больше кода для решения таких «простых» задач.

1 голос
/ 06 марта 2018

Опираясь на ответ BalusC, в более новых версиях JSF можно сделать это без списка вспомогательных компонентов (я использую JSF 2.2):

        <h:selectOneMenu id="Value" value="#{cc.attrs.value}">
            <f:selectItem itemLabel="#{cc.attrs.placeholder}" noSelectionOption="true">
                <f:passThroughAttribute
                    rendered="#{not empty cc.attrs.placeholder}"
                    name="hidden" value=""/>
            </f:selectItem>
            <f:selectItems value="#{empty cc.attrs.allLabel ? [] : [1]}"
                var="item"
                itemLabel="#{cc.attrs.allLabel}"
                itemValue="#{cc.attrs.allValue}"/>
            <f:selectItems value="#{cc.attrs.codeList}" var="code" itemLabel="#{code.codeDesc}" itemValue="#{code.userCode}"/>
        </h:selectOneMenu>

Я обернул его в составной компонент снекоторые конкретные требования.Часть, связанная с этим вопросом, использует f:selectItems со значением [] или [1].Когда ваше условие заставляет его использовать [], тогда оно будет полностью опущено, а когда оно использует [1], тогда оно помещает в один элемент нужные значения.

0 голосов
/ 20 марта 2019

Для меня самый «чистый» способ - использовать 2019 с использованием JSF 2.3, чтобы избежать смешивания jsf/html с jstl до

  1. set itemDisabled="true" и
  2. пользовательский класс, использующий jsf/passthrough pt:class="hidden".
<f:selectItem itemValue="itsValue" itemLabel="example"
    itemDisabled="#{exampleBean.hideItem}" 
    pt:class="#{exampleBean.hideItem ? 'hidden' : ''}" />

Конечно, вам нужен стиль CSS

.hidden {
    display: none !important;
}

Преимущество в том, что его можно отключитьэлементы в вашем списке.

0 голосов
/ 26 января 2015

Я решил мою проблему, делая это

<p:selectOneRadio id="myId" value="#{myView.myProperty}">
   <h:panelGroup rendered="#{myView.showMyOption}">
      <f:selectItem itemLabel="My Option" itemValue="0"/>
   </h:panelGroup>
   <f:selectItem itemLabel="My Option 1" itemValue="1"/>
   <f:selectItem itemLabel="My Option 2" itemValue="2"/>
</p:selectOneRadio>
...