JSF h: проверка inputText и F: рендеринг ajax

очень простое приложение JSF:

  • элементу InputText присваивается валидатор.
  • f: ajax используется для визуализации следующего элемента (phoneNumber) с помощью 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;
}

проблема, по некоторым причинам, номер_телефона не отображается вообще.

единственный способ заставить его работать-это изменить 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:ajax с определенным идентификатором элемента и визуализируется на основе атрибута managedBean не может сосуществовать.

есть идеи или советы, ребята?

Примечание: это поведение также происходит, когда я использую слушателя вместо валидатора

1 ответов


на f:ajax работает на стороне клиента. Элемент, который указан в render должно уже присутствовать в дереве HTML DOM на стороне клиента. Поместите его, например, в h:panelGroup вместо этого, который всегда оказываться на стороне клиента.

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