2013-04-08 29 views
0

這裏的情況是:JSF組件不再呈現,但FacesMessage就會保持

  1. 我有一個組件,它的值是我ViewScoped豆,它得到它做一些錯誤時產生的的FacesMessage的屬性的形式首先提交
  2. 在隨後的用戶動作,啊:commandlink被點擊時,它使用F:AJAX,和其的ActionListener設置爲不再被呈現
  3. 在接收到該效應初探的部件,所述部件是不再呈現(如預期的那樣),但FacesMessage仍然保留並顯示

我正在使用Mojarra JSF 2.1和IceFaces 3.0--儘管這個例子和有問題的行爲只能使用標準的JSF組件。下面是演示行爲的一個小例子:如果我改變的H

test.xhtml

<h:form id="testform"> 
    <h:message for="tv"/> 
    <h:inputText id="tv" value="#{testBean.testVal}" rendered="#{testBean.testValRendered}" required="true" /> 
    <h:commandButton value="Submit"/> 
      <h:commandLink actionListener="#{testBean.toggleTestVal}" value="Toggle input"> 
     <f:ajax execute="@this" render="@form"/> 
    </h:commandLink> 
</h:form> 

豆代碼

@ViewScoped 
@ManagedBean(name = "testBean") 
public class TestBean { 

    private String testVal; 
    private boolean testValRendered; 

    public TestBean() { 
     testValRendered = true; 
    } 

    public String getTestVal() { 
     return testVal; 
    } 

    public void setTestVal(String testVal) { 
     this.testVal = testVal; 
    } 

    public boolean isTestValRendered() { 
     return testValRendered; 
    } 

    public void setTestValRendered(boolean testValRendered) { 
     this.testValRendered = testValRendered; 
    } 

    public void toggleTestVal(ActionEvent ae) { 
     testValRendered = !testValRendered; 
    } 
} 

:commandLink,以便它不使用f:ajax,並在其上設置immediate ='true',然後正確刪除該消息。雖然這在某些情況下可能會起作用,但我想要理解爲什麼使用f:ajax來渲染事物,如我在示例中所示不起作用。謝謝。

回答

1

輸入組件在其渲染條件被切換之前被提交,處理和驗證。 <h:message>不知道關聯的輸入組件未呈現。你想檢查非常相同的渲染條件對<h:message>還有:

<h:message for="tv" rendered="#{testBean.testValRendered}" /> 
<h:inputText id="tv" ... rendered="#{testBean.testValRendered}" /> 
+0

很公平,但對於我使用一個整個形式來代替,而不能只是有條件地呈現它的情況?你是說即使它未被執行,組件正在處理和驗證? – nagohs 2013-04-08 19:20:34

+0

標記您的答案接受,因爲它提供了我原來的問題的解決方案。但是,我想我真正希望得到的答案是爲什麼會發生這種情況,以及是否有任何其他方式讓消息自行「正常」地被刪除。看到我以前的評論。 – nagohs 2013-04-10 17:21:08