<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>
.