Подтвердите ввод как требуется, только если определенная командная кнопка нажата
У меня есть конкретный случай использования для проверки 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}"/>
Каковы мои просьбы:
- Когда кнопка отправки нажата, все проверки должны быть обработаны, и это нормально, это работает нормально.
- Когда событие размытия запускается в поле ввода, если поле не пустое, должна быть обработана проверка числа, и это тоже ОК. В конце я обновляю поле с идентификатором
name
с некоторым значением. - Теперь у меня проблема. Мой третий запрос - когда ввод пуст, проверка на ввод не должна обрабатываться. Это особый случай, в котором я буду очищать поле с идентификатором
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);
}
}
}
}