Как условно отобразить тег f: selectItem?
Как указать условный рендеринг для тега <f:selectItem>
.
Мне нужно отображать опции <f:selectItem>
в соответствии с конкретным статусом пользователя.
Например, я хотел что-то вроде:
<f:selectItem itemLabel="Yes! I need a girlfriend!"
rendered="false(or some boolean condition)"
itemValue="o1"/>
Ответы
Ответ 1
<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>
вы больше зависите от того, поддерживает ли webbrowser скрытие отключенных опций с помощью 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>
в базе bean на основе вычисленных условий и связать ее с <f:selectItems>
.
Ответ 2
Обходной путь, который я использую, - это установить атрибут itemDisabled и использовать этот CSS:
select option[disabled] { display: none; }
Но он должен быть исправлен правильно в JSF.
Ответ 3
<c:if>
для меня также не работает, если это зависит от повторяющейся переменной `component (на первой фазе сборки она работает, но с использованием ajax и обновления коллекции для каждого из них не удается, показывая несколько элементов дважды и другие нет)
Это действительно одна большая проблема в JSF. Отключение не всегда является опцией, и таким образом в bean требуется гораздо больше кода для решения таких "простых" вещей.
Ответ 4
Вы можете заключить его в код ui:fragment
:
<ui:fragment rendered="false(or some boolean condition)">
<f:selectItem itemLabel="Yes! I need a girlfriend!" itemValue="o1"/>
</ui:fragment>
Затем элемент будет отображаться только тогда, когда логическое кодирование истинно.
Ответ 5
Основываясь на ответе 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]
оно помещает в один элемент нужные значения.
Ответ 6
Я решил свою проблему, делая это
<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>