首页 文章

JSF h:inputText验证和f:ajax渲染

提问于
浏览
6

一个非常简单的JSF应用程序:

  • InputText元素与Validator一起分配 .

  • f:ajax用于通过 blur 事件呈现下一个元素(phoneNumber) .

  • 仅当inputText传递验证器且isValid布尔值设置为true时,才会显示PhoneNumber

这是代码片段

<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的ajax和基于managedBean Attribute的呈现不能共存 .

任何想法或建议的家伙?

注意:当我使用侦听器而不是验证器时,也会发生此行为

1 回答

  • 7

    f:ajax 在客户端运行 . render 中指定的元素必须已存在于客户端HTML DOM树中 . 把它放在例如 h:panelGroup 中,而不是总是呈现给客户端 .

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

相关问题