Проверка JSF h: inputText и рендеринг f: ajax - PullRequest
6 голосов
/ 10 ноября 2010

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

  • Элемент InputText назначается с помощью Validator.
  • 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;
}

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

Любая идея или совет, ребята?

ПРИМЕЧАНИЕ: такое поведение также происходит, когда я использую слушатель вместо валидатора

1 Ответ

7 голосов
/ 10 ноября 2010

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

<h:panelGroup id="phoneLabel">
    <h:outputText rendered="#{person.isValid}" value="#{person.phoneNumber}" />
</h:panelGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...