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

У меня есть конкретный пример использования для проверки 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}"/>

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

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

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

Ответ 1

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

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

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

(обратите внимание: do не привязывает его к свойству bean код как-есть)

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

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

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

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

Ответ 2

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

<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 реализует валидатор {

@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);
        }
    }
}

}