有条件地渲染p:commandLinks

时间:2014-10-01 20:53:40

标签: jsf primefaces jsf-2.2 commandlink

我正在实施一些搜索过滤器。每个搜索组件(<p:commandLink><p:inputText>等)旁边会显示<p:selectOneMenu>

<p:inputText id="text" value="#{bean.text}" required="true"/>

<h:panelGroup id="panelGroup">
    <p:commandLink process="@this text" update="panelGroup text" actionListener="#{bean.action}" rendered="#{empty param['form:text']}">
        <h:outputText styleClass="ui-icon ui-icon-search"/>
    </p:commandLink>

    <p:commandLink process="@this" update="panelGroup text" actionListener="#{bean.resetAction}" rendered="#{not empty param['form:text']}">
        <h:outputText styleClass="ui-icon ui-icon-trash"/>
        <p:resetInput target="text"/>
    </p:commandLink>
</h:panelGroup>

当点击第一个<p:commandLink>(带有搜索图标的那个)并且给定的<p:inputText>不为空时,预计链接将消失,另一个链接(带有垃圾图标的链接)预计将被渲染(反之亦然)。

发生这种情况但未调用第一个链接(actionListener="#{bean.action}")指示的动作侦听器,因为链接是基于<p:inputText>的值呈现的。 rendered="#{empty param['form:text']}"负责阻止侦听器被调用。

当出现带有垃圾桶图标的链接时,它会重置输入组件,如果它被单击但不会消失。只有再次单击它时才会消失(然后会出现搜索)。


如何正确处理这种情况?如果没有违反验证/转换并点击了搜索链接,则链接应该消失,并且应该呈现垃圾链接。

相反,当垃圾链接出现并且单击它时,它应该重置<p:inputText>然后消失,以便可以呈现搜索链接。

1 个答案:

答案 0 :(得分:2)

您实际上想要在调用操作后仅切换渲染。当动作事件即将排队时,在应用请求值阶段期间也会遵循rendered属性。如果它评估false,则操作事件不会排队,因此在调用应用程序阶段期间不会调用该操作。

最好直接检查模型值。在设置模型值之前,操作将排队。并且,当对模型值进行转换/验证时,这也应该更好。

<p:inputText ... value="#{bean.text}" />
<p:commandLink ... rendered="#{empty bean.text}" />
<p:commandLink ... rendered="#{not empty bean.text}" />