2014-10-01 85 views
2

我正在实现一些搜索过滤器。 A <p:commandLink>显示在每个搜索组件旁边(<p:inputText>,<p:selectOneMenu>等)。有条件呈现p:commandLinks

<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>然后消失,以便可以呈现搜索链接。

回答

2

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

更好的是直接检查模型的值。在之前,行动排队模型值被设置。而且,对模型值进行转换/验证时,这应该也会更好。

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