2017-02-17 5 views
0

У меня есть поля в окне, некоторые с валидаторами и все связаны свойствами. Валидация работает должным образом.Что было бы лучшим способом проверить, действительно ли все поля?

Но -

Я не хочу, чтобы продолжить, когда любое поле является недействительным. Какой был бы лучший способ определить, не прошла ли какая-либо проверка?

+0

Зависит от используемой модели данных, но вот интересная ссылка http://demo.vaadin.com/book-examples-vaadin7/book#component.field.validation.basic –

ответ

0

Поддержание флага. Прежде чем продолжить, проверьте, установлен ли флаг. В коде проверки установите флаг, если проверка не выполнена.

+0

Я создал фабричный класс для прокси-серверов Validator который отслеживает все проверки и может вернуть, проверяются ли все валидаторы. Работает подобно этому 'textField.addValidator (allValid.too (новый EmailValidator (« Пожалуйста, введите действительный адрес электронной почты »)));' и 'allValid.isAllValid()' –

1

Существует несколько способов решения валидации в Vaadin, все из которых поддерживаются Vaadin (нет необходимости в пользовательском логическом afterValidationFlag). Одним из возможных способов (предпочитали мной), как показано ниже:

public class CustomWindow extends Window { 

    DateField customBeanFirstPropertyName = new DateField("Caption1"); 
    ComboBox customBeanSecondPropertyName = new ComboBox("Caption2"); 
    TextArea customBeanThirdPropertyName = new TextArea("Caption3"); 

    BeanFieldGroup<CustomBean> binder = new BeanFieldGroup<>(CustomBean.class); 

    public CustomWindow(CustomBean customBean) { 
     buildLayout(); 
     binder.buildAndBindMemberFields(this); 
     binder.setItemDataSource(new BeanItem<>(customBean)); 

     //add validators 
     customBeanFirstPropertyName.addValidator((Validator) value -> { 
      if (value == null) throw new Validator.InvalidValueException("nonnull required"); 
     }); 
     customBeanThirdPropertyName.addValidator(
       new RegexpValidator(".{3,20}", "length between 3-20 required") 
     ); 
     /* 
     or have basic validators on @Entity level with e.g. javax.validation.constraints.Size 
     example: 
     @Size(min = 3, max = 20) 
     @Column(name = "customBeanThirdPropertyName", unique = true) 
     private String customBeanThirdPropertyName; 
     */ 
    } 

    void commit(Button.ClickEvent event) { //method called by "save" button 
     try { 
      binder.commit(); //internally calls valid() method on each field, which could throw exception 
      CustomBean customBeanAfterValidation = binder.getItemDataSource().getBean(); //custom actions with validated bean from binder 
      this.close(); 
     } catch (FieldGroup.CommitException e) { 
      Map<Field<?>, Validator.InvalidValueException> invalidFields = e.getInvalidFields(); //do sth with invalid fields 
     } 
    } 
} 
1

Если вы используете экземпляр FieldGroup, чтобы связать свои поля со свойствами, что является рекомендуемым способом, вы можете написать:

fieldGroup.isValid(); 

Это проверяет все проверки полей полей, управляемых группой полей.

Смежные вопросы