Об этом спрашивали несколько раз, и, насколько я знаю, невозможно добавить валидаторы без связующего. Вы можете проверить этот ответ для подробного описания функции и резонанса.
Обсуждения также ведутся на форуме Vaadin и github, и два основных предложения — использовать связующее или прослушиватель изменения значения, когда вы вручную вызываете валидатор. Однако последнее решение, похоже, не работает, и я подозреваю, что это связано с тем, что событие изменения значения запускается только при изменении фактического значения, чего, вероятно, не происходит, когда вы вводите что-то недопустимое, но я не тратил много времени на расследование.
последнее предложение на github запрашивает binder.noBind()
метод для облегчения этих случаев, но пока это не реализовано, вы можете использовать что-то похожее на приведенный ниже пример кода. Мне также не нравилась идея использования поля для привязки значения, поэтому я выбрал концепцию без сеттера и без геттера:
public class DateFieldWithValidator extends VerticalLayout {
public DateFieldWithValidator() {
// date field with binder
Binder<LocalDate> binder = new Binder<>();
DateField dateField = new DateField("Date");
binder.forField(dateField)
.asRequired("Please select a date")
.bind(No.getter(), No.setter());
// validity status
TextField validityField = new TextField("Status:", "N/A");
validityField.setReadOnly(true);
validityField.addStyleName(ValoTheme.TEXTFIELD_BORDERLESS);
validityField.setWidth("100%");
// submit button
Button submitButton = new Button("Submit");
submitButton.addClickListener(event -> {
BinderValidationStatus<LocalDate> status = binder.validate();
if (status.isOk()) {
validityField.setValue("OK: " + dateField.getValue().toString());
} else {
validityField.setValue("KO: " + status.getValidationErrors().stream().map(ValidationResult::getErrorMessage).collect(Collectors.joining(",")));
}
});
addComponents(dateField, submitButton, validityField);
}
// convenience empty getter and setter implementation for better readability
public static class No {
public static <SOURCE, TARGET> ValueProvider<SOURCE, TARGET> getter() {
return source -> null;
}
public static <BEAN, FIELDVALUE> Setter<BEAN, FIELDVALUE> setter() {
return (bean, fieldValue) -> {
//no op
};
}
}
}
Результат:
Позднее обновление:
Я подумал еще немного, и если это приемлемо, вы можете отключить кнопку отправки, если значение равно null или возникает ошибка синтаксического анализа для недопустимого значения. Это можно легко реализовать с помощью ValueChangeListener
и ErrorHandler
, как показано ниже.
В качестве альтернативы вы можете сохранить сообщение об исключении в переменной, и когда вы нажмете кнопку, проверьте, есть ли сообщение об ошибке или значение равно null, в этом порядке, потому что, если вы введете недопустимую дату, значение поля будет установлено на нулевой.
public class DateFieldWithValidator extends VerticalLayout {
public DateFieldWithValidator() {
DateField dateField = new DateField("Date");
Button submitButton = new Button("Submit");
submitButton.setEnabled(false);
submitButton.addClickListener(event -> Notification.show("Selected date: " + dateField.getValue()));
dateField.setRequiredIndicatorVisible(true);
dateField.setErrorHandler(event -> submitButton.setEnabled(false));
dateField.addValueChangeListener(event -> submitButton.setEnabled(event.getValue() != null));
addComponents(dateField, submitButton);
}
}
Результат:
person
Morfic
schedule
06.10.2017
Binder
(vaadin.com/api/8.0.1 /com/vaadin/data/Binder.html)?Binder
поставляется с такими методами, какvalidate()
иisValid()
. - person Thibstars   schedule 06.10.2017