2013-05-05 241 views
1

我已經得到了這段代碼,它並不完全符合我的想法。我嘗試通過Ajax設置屬性,然後重新渲染一個組件。我.xhtml看起來像這樣渲染<h:panelGroup> by jsf中的ajax

<h:form> 
     <h:commandButton value="Render!" > 
      <f:ajax render=":result" listener="#{eFindUser.findUser}" /> 
     </h:commandButton> 

    </h:form> 

    <h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" > 
     This is some text that is supposed to be rendered later 
    </h:panelGroup> 

支持bean看起來像這樣

@Named(value = "eFindUser") 
@ViewScoped 
public class EFindUserManagedBean implements Serializable{ 
    private boolean responseRendered = false; 
    /** 
    * Creates a new instance of EFindUserManagedBean 
    */ 

    public EFindUserManagedBean() { 
    } 

    public void findUser(AjaxBehaviorEvent abe) { 
     responseRendered = !responseRendered; 
     System.out.println("finding..... ("+ responseRendered+")" + this); 
    } 
    public boolean isResponseRendered() { 
     return responseRendered; 
    } 

    public void setResponseRendered(boolean responseRendered) { 
     this.responseRendered = responseRendered; 
    }  
} 

當我再次點擊該按鈕時,該屬性沒有改變。有一個在SERVERLOG消息,該消息稱

INFO: finding..... (true)[email protected] 
INFO: finding..... (true)[email protected] 

顯然有一些問題與託管bean,因爲它創建的每個有即使它應該是視圖範圍的請求的時間。

我應該改變什麼,以便panelgroup(id:「result」)可以改變它的可見性?沒有richfaces或任何其他技術允許。

非常感謝你對你的答案

回答

2

這個工作對我來說:

<ui:composition> 
<h:form id="mainForm"> 
     <h:commandButton value="Render!" action="#{eFindUser.findUser}"> 
      <f:ajax event="action" render=":result" /> 
     </h:commandButton> 
</h:form> 

    <h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" > 
     This is some text that is supposed to be rendered later 
    </h:panelGroup> 

</ui:composition> 

豆:

@ManagedBean 
@ViewScoped 
public class EFindUser implements Serializable{ 
    private static final long serialVersionUID = -7106162864352727534L; 
    private boolean responseRendered = false; 

    public EFindUser() { 
    } 

    public void findUser() { 
     responseRendered = !responseRendered; 
     System.out.println("finding..... ("+ responseRendered+")" + this); 
    } 
    public boolean isResponseRendered() { 
     return responseRendered; 
    } 

    public void setResponseRendered(boolean responseRendered) { 
     this.responseRendered = responseRendered; 
    }  
} 

就以JSF 2.0 + Ajax Hello World Example

+0

雖然不適用於我。可能是因爲我在使用CDI.Yes!而已。 CDI沒有查看範圍。結合Alexandre Lavoie的回答,我得到了它的工作,謝謝。 – 2013-05-05 20:28:03

5

不能呈現的樣子動態地顯示一個並非始終呈現的JSF組件。該對象必須存在於DOM客戶端。當使用rendered =「false」時,輸出不會生成服務器端。

更改您這樣的代碼:

<h:form> 
    <h:commandButton value="Render!" > 
     <f:ajax render=":result" listener="#{eFindUser.findUser}" /> 
    </h:commandButton> 

</h:form> 

<h:panelGroup id="result"> 
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" > 
     This is some text that is supposed to be rendered later 
    </h:panelGroup> 
</h:panelGroup> 

隨即,DOM將始終包含一個id = 「結果」 的東西。

+0

可能是但不能解決視圖範圍託管bean的重新創建。這樣''{eFindUser.responseRendered}''總是被解析爲false – 2013-05-05 19:59:00

+0

非常感謝解決方案!正如你所說,指出第一個'panelGroup'將總是生成一個''(void第二個小組的財產是假的) – troig 2016-06-28 09:17:34