<f:selectItem> does not 支持 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;
}
服务器端的替代方法是在单个 <f:selectItem> 周围引入一个 JSTL <c:if> 以有条件地将其添加到这样的视图中(确保您了解 JSTL 在 JSF 中的工作方式:JSTL in JSF2 Facelets... makes sense?):
<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" />
或者,您可以简单地根据计算的条件在支持 bean 中动态填充 List<SelectItem>,并将其与 <f:selectItems> 绑定。