2

我正在尝试从现有的 Primefaces 组件构建一个自定义组件,我需要一些帮助。我有一个 selectOneMenu,我希望它根据在菜单中选择的选项来呈现或不呈现(并禁用或启用)其他组件。这里的困难是我不能使用托管 Bean 来做到这一点(我有几个原因),我需要一个纯 xhtml 代码。

我尝试了一些<c:choose>东西<ui:parameter>来创建布尔值,但由于某种原因,我看不到它不起作用。你们可以看看我的代码,看看你有什么想法吗?这可能是一些我无法理解的简单事情或我还不知道的事情。

<h:body>
<h:form id="abc">
    <ui:repeat var="pd" value="#{produtoMB.produtos}">
        <h:panelGroup id="linha">
        <c:choose>
            <c:when test="#{pd.marca == X1}">
                <c:set var="render" value="#{true}" />
            </c:when>
            <c:otherwise>
                <c:set var="render" value="#{false}" />
            </c:otherwise>
        </c:choose>

        <p:selectOneMenu value="#{pd.marca}">
            <f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true"/>
            <f:selectItem itemLabel="Xbox One" itemValue="X1" />
            <f:selectItem itemLabel="PlayStation 4" itemValue="PS4" /> 
            <f:selectItem itemLabel="Wii U" itemValue="WU" />
            <p:ajax update="linha" />
        </p:selectOneMenu>
        <p:inputText value="#{pd.aparelho}" disabled="#{render}"/>
        <h:outputText value="Microsoft" rendered="#{render}"/>
        <p:commandButton value="X" />
        </h:panelGroup>
        <br />
    </ui:repeat>
    <br />
    <p:commandButton actionListener="#{produtoMB.botaoMais}" value="+" update="abc"/>
    <p:commandButton actionListener="#{produtoMB.botaoMenos}" value="-" update="abc"/>
</h:form>

4

1 回答 1

0

这里有几个问题。

第一的,

<ui:repeat ...>
    <c:choose>
        ...
    </c:choose>
</ui:repeat>

JSTL 标记在视图构建期间运行。它只在所有 JSF 组件运行之前执行一次。因此,与您对 XML 代码流的直观期望相反,它不会在<ui:repeat>组件运行和迭代时执行。另请参阅JSF2 Facelets 中的 JSTL... 有意义吗?

第二,

<c:when test="#{pd.marca == X1}">
...
<f:selectItem ... itemValue="X1" />

itemValue="X1"代表String一个。EL 表达式#{X1}主要查找X1分别在 facelet、请求、视图、会话和应用程序范围中命名的变量,直到找到第一个非空值。为了String在 EL 中表示一个值,您需要像这样用单引号引用它#{'X1'}。所以,你应该#{pd.marca == 'X1'}改用。尽管如此,由于第一点中提到的原因,这仍然行不通。另请参阅指定 <ui:repeat> 内元素的条件渲染?<c:if> 似乎不起作用

但是,您可以使用<c:set>在 EL 范围内创建别名,只要您不设置其scope属性即可。另请参阅在 JSF 页面中定义和重用 EL 变量

在删除 JSTL<c:choose>并修复 EL 表达式#{X1}以表示一个真实的String文字#{'X1'}后,它应该是这样的:

<ui:repeat var="pd" value="#{produtoMB.produtos}">
    <p:selectOneMenu value="#{pd.marca}">
        <f:selectItem itemLabel="Select One" itemValue="#{null}" />
        <f:selectItem itemLabel="Xbox One" itemValue="X1" />
        <f:selectItem itemLabel="PlayStation 4" itemValue="PS4" /> 
        <f:selectItem itemLabel="Wii U" itemValue="WU" />
        <p:ajax update="linha" />
    </p:selectOneMenu>
    <h:panelGroup id="linha">
        <c:set var="marcaIsX1" value="#{pd.marca eq 'X1'}" />
        <p:inputText value="#{pd.aparelho}" disabled="#{marcaIsX1}" />
        <h:outputText value="Microsoft" rendered="#{marcaIsX1}" />
    </h:panelGroup>
    <p:commandButton value="X" />
</ui:repeat>

请注意,我还删除了未使用的noSelectionOption="true"并移动了<h:panelGroup id="linha">包装真正需要更新的组件。

于 2015-09-22T06:05:19.557 回答