2010-11-10 185 views
6

一個非常簡單的JSF的一個應用:JSF H:inputText的驗證和f:AJAX渲染

  • inputText的元件被分配了驗證。
  • f:ajax通過使用blur事件來渲染下一個元素(phoneNumber)。如果inputText的通過驗證和的isValid布爾值
  • ******中國將只顯示被設置爲true

這裏是代碼片段

<h:form id="invOrdersWizForm">         
    <h:inputText id="name" maxlength="9" styleClass="ordLabelNarrow" 
     validator="#{person.validatePerson}"         
     value="#{person.name}"> 
     <f:ajax render="phoneLabel" event="blur"/>                
    </h:inputText> 
    <h:outputText id="phoneLabel" 
     rendered="#{person.isValid}"       
     styleClass="ordLabelWide" value="#{person.phoneNumber}" /> 
</h:form> 

ManagedBean

public void validatePerson(FacesContext context, UIComponent toValidate, Object value) { 
    name = ((String) value).toUpperCase(); 
    phoneNumber = "12345678"; 
    isValid = true; 
} 

的問題是,出於某種原因,phoneNumber根本沒有被渲染。

,我可以讓它工作的唯一方法是通過改變F:AJAX渲染@form

<h:inputText id="name" maxlength="9" styleClass="ordLabelNarrow" 
    validator="#{person.validateSecurityCode}"        
    value="#{person.name}"> 
    <f:ajax render="@form" event="blur"/>                
</h:inputText> 

或者從phoneNumber的

rendered="#{person.isValid}" 

移除渲染出於某種原因,F:阿賈克斯具體元素Id並基於managedBean屬性呈現不能共存。

任何想法或建議傢伙?

注:當我使用監聽器,而不是驗證這種行爲也發生

回答

7

f:ajax在客戶端運行。在render中指定的元素必須已經存在於客戶端HTML DOM樹中。把它放在例如一個h:panelGroup而不是它總是呈現給客戶端。

<h:panelGroup id="phoneLabel"> 
    <h:outputText rendered="#{person.isValid}" value="#{person.phoneNumber}" /> 
</h:panelGroup>