43

如何为<f:selectItem>标签指定条件渲染。我需要<f:selectItem>根据特定用户的状态显示选项。

例如,我想要类似的东西:

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

8 回答 8

71

<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;
}

服务器端的替代方案是在<c:if>个人周围引入一个 JSTL <f:selectItem>,以便像这样将其添加到视图中(确保您了解 JSTL 在 JSF 中的工作方式:JSF2 Facelets 中的 JSTL...有意义吗?):

<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 中动态填充 a并将其绑定到<f:selectItems>.

于 2011-08-03T19:35:24.160 回答
6

我使用的解决方法是设置 itemDisabled 属性并使用此 CSS:

select option[disabled] { display: none; }

但它需要在 JSF 中正确修复。

于 2012-05-09T06:41:42.140 回答
3

<c:if>对我来说,如果它依赖于`组件的重复变量,它也不起作用(在第一个构建阶段它工作但使用ajax并更新for-each的集合失败,显示一些项目两次而其他项目不)

这确实是 JSF 中的一个大问题。禁用并不总是一种选择,这样在 bean 中需要更多的代码来解决这些“简单”的事情。

于 2012-02-18T00:57:19.730 回答
2

您可以将其包装成ui:fragment代码:

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

只有当布尔编码为真时才会渲染项目。

于 2015-02-27T11:39:26.647 回答
1

基于 BalusC 的回答,在较新版本的 JSF(我使用的是 JSF 2.2)中,可以在没有支持 bean 列表的情况下做到这一点:

        <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值为[]or 或[1]。当您的条件使其使用[]时,它将被完全省略,当它使用时,它[1]会放入具有您想要的值的单个项目。

于 2018-03-06T15:18:17.760 回答
0

您也可以使用 JS (jQuery) 隐藏它。在 Primefaces 上:

$('.ui-selectoneradio .ui-state-disabled').closest('tr').hide();

这是为了p:selectOneRadio. 请注意,如果您更新组件或组件的容器,则必须重新运行代码。

于 2021-06-10T09:34:44.803 回答
0

对我来说,“最干净”的方式是在 2019 年使用 JSF 2.3,以避免jsf/htmljstlto

  1. 设置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;
}

这样做的好处是您的列表中仍然可以有禁用的元素。

于 2019-03-20T13:37:28.480 回答
-2

I solved my problem doing this

<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>
于 2015-01-26T18:07:47.780 回答