Подтвердите ввод как требуется, только если определенная командная кнопка нажата

У меня есть конкретный случай использования для проверки JSF. Например, у меня есть inputText поле:

<p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}">
  <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/>
</p:inputText>

Значение ввода - это число (в некоторых случаях это также может быть строка, потому что это часть составного компонента, но проблему лучше описать, если предположить, что это число). Этот вход является частью формы, в конце формы у меня есть кнопка отправки:

<p:commandButton value="Save" actionListener="#{myBean.save}"/>

Каковы мои просьбы:

  1. Когда кнопка отправки нажата, все проверки должны быть обработаны, и это нормально, это работает нормально.
  2. Когда событие размытия запускается в поле ввода, если поле не пустое, должна быть обработана проверка числа, и это тоже ОК. В конце я обновляю поле с идентификатором name с некоторым значением.
  3. Теперь у меня проблема. Мой третий запрос - когда ввод пуст, проверка на ввод не должна обрабатываться. Это особый случай, в котором я буду очищать поле с идентификатором name, Это также тот случай, когда я удаляю текст, который уже введен во входные данные, удаляю фокус с компонента (например, нажмите клавишу TAB), и в этом случае также должен быть обработан AJAX-запрос, и ввод имени также будет очищен.

Как я могу отключить проверку этого поля ввода в случае, когда оно пустое, и только для этого события ajax?

2 ответа

Решение

Пусть вход required Атрибут проверяет, нажата или нет кнопка сохранения (что можно определить по наличию его идентификатора клиента в карте параметров запроса).

<h:form>
    <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" />

    <p:commandButton binding="#{save}" ... />
</h:form>

(примечание: не связывайте его со свойством bean-компонента! код не изменен)

Таким образом, это будет только оценить true когда кнопка сохранения фактически нажата.

Или, если у вас есть проблемы с binding и / или нет проблем с жестким кодированием идентификатора клиента кнопки:

<h:form id="formId">
    <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" />

    <p:commandButton id="buttonId" ... />
</h:form>

Просто удалите обязательный атрибут, поскольку вы принимаете ввод, если ввод пуст. Затем напишите пользовательский валидатор, который принимает только пустой ввод или числовой ввод.

<p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator">   <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText>

открытый класс customerNumericInputValidator реализует Validator {

@Override
public void validate(FacesContext facesContext, UIComponent uIComponent,
        Object object) throws ValidatorException {

    String number = (String) object;
    number = Strings.nullToEmpty(number).trim();

    //if the request is a full request then number can not be empty
    if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number))
    {
         FacesMessage message = new FacesMessage();
         message.setSummary(Messages.getMessage("error empty value"));
         message.setSeverity(FacesMessage.SEVERITY_ERROR);
         throw new ValidatorException(message);
    } 

    if(!Strings.isNullOrEmpty(number))
    { 
        if(!isNumber(number))
        {
           FacesMessage message = new FacesMessage();
           message.setSummary(Messages.getMessage("error not numerical value"));
           message.setSeverity(FacesMessage.SEVERITY_ERROR);
           throw new ValidatorException(message);
        }
    }
}

}

Другие вопросы по тегам