如何为<f:selectItem>
标签指定条件渲染。我需要<f:selectItem>
根据特定用户的状态显示选项。
例如,我想要类似的东西:
<f:selectItem itemLabel="Yes! I need a girlfriend!"
rendered="false(or some boolean condition)"
itemValue="o1"/>
如何为<f:selectItem>
标签指定条件渲染。我需要<f:selectItem>
根据特定用户的状态显示选项。
例如,我想要类似的东西:
<f:selectItem itemLabel="Yes! I need a girlfriend!"
rendered="false(or some boolean condition)"
itemValue="o1"/>
<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>
.
我使用的解决方法是设置 itemDisabled 属性并使用此 CSS:
select option[disabled] { display: none; }
但它需要在 JSF 中正确修复。
<c:if>
对我来说,如果它依赖于`组件的重复变量,它也不起作用(在第一个构建阶段它工作但使用ajax并更新for-each的集合失败,显示一些项目两次而其他项目不)
这确实是 JSF 中的一个大问题。禁用并不总是一种选择,这样在 bean 中需要更多的代码来解决这些“简单”的事情。
您可以将其包装成ui:fragment
代码:
<ui:fragment rendered="false(or some boolean condition)">
<f:selectItem itemLabel="Yes! I need a girlfriend!" itemValue="o1"/>
</ui:fragment>
只有当布尔编码为真时才会渲染项目。
基于 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]
会放入具有您想要的值的单个项目。
您也可以使用 JS (jQuery) 隐藏它。在 Primefaces 上:
$('.ui-selectoneradio .ui-state-disabled').closest('tr').hide();
这是为了p:selectOneRadio
. 请注意,如果您更新组件或组件的容器,则必须重新运行代码。
对我来说,“最干净”的方式是在 2019 年使用 JSF 2.3,以避免jsf/html
与jstl
to
itemDisabled="true"
和jsf/passthrough
pt:class="hidden"
.<f:selectItem itemValue="itsValue" itemLabel="example"
itemDisabled="#{exampleBean.hideItem}"
pt:class="#{exampleBean.hideItem ? 'hidden' : ''}" />
当然你需要CSS样式
.hidden {
display: none !important;
}
这样做的好处是您的列表中仍然可以有禁用的元素。
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>