Vaadin : установка значения в текстовое поле «с сервера» не запускает пользовательское поле::generateModelValue

#vaadin #vaadin-flow

Вопрос:

Я реализовал пользовательское поле, которое содержит два простых текстовых поля.

 public class MyCustomField extends CustomField<MyCustomPojo> {

    private TextField freeTextField;
    private TextField searchTextField;
    private Binder<MyCustomPojo> binder;
    private MyCustomPojo myCustomPojo;

    public MyCustomField(){

        this.binder = new Binder<>(MyCustomPojo.class);
        this.myCustomPojo = new MyCustomPojo();

        freeTextField = new TextField();
        searchTextField = new TextField();
        searchTextField.addFocusListener(event -> showSearchPopup());
}

    public void handleSearchResult(String searchResult){
        searchTextField.setValue(searchResult);
        this.updateValue();
    }


    @Override
    protected MyCustomPojo generateModelValue() {
        binder.writeBeanIfValid(this.customPojo);
        return this.customPojo;
    }

    @Override
    protected void setPresentationValue(MyCustomPojo customPojo) {
        if(oriasModel != null) {
            this.customPojo= customPojo;
            binder.readBean(this.customPojo);
        }
    }

}
 

Первое текстовое поле может быть свободно заполнено любым пользовательским вводом.
Второе текстовое поле немного особенное, потому что, когда пользователь фокусируется на нем, открывается диалоговое окно поиска, и пользователь должен выполнить поиск данных, а затем значение текстового поля устанавливается с помощью операции Textfield::setValue.

Моя проблема в том, что операция «generateModelValue» никогда не вызывается, когда я задаю значение текстового поля из результата поиска. Но когда я сначала ищу заполнение «searchTextField», а затем вручную вводю «freeTextField», затем вызывается «generateModelValue», и результирующий компонент заполняется.

Комментарии:

1. Если я правильно понимаю этот вопрос, поведение соответствует задумке. Вы не добавили прослушиватель изменения значения в свое текстовое поле. Вероятно, вам следует добавить один и выполнить явный вызов некоторого метода, который не обязательно является значением generatemodel. Или даже забудьте об этом и делайте правильные вещи, когда вызывается значение самого поля. Вероятно, вы пытаетесь заполнить свой пользовательский компонент и хотите запустить проверку связующего.

2. Дело в том, что мой пользовательский компонент используется в форме со связующим. И когда значение вложенных полей изменяется с помощью «handleSearchResult», форма не вызывает GetValue ou generateModelValue. Похоже, что форма не знает, что значение изменилось. Если пользовательский компонент содержит другие поля, и если эти поля вводятся вручную, то форма знает, что было внесено изменение.