2014-10-01 107 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}" />