#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. Похоже, что форма не знает, что значение изменилось. Если пользовательский компонент содержит другие поля, и если эти поля вводятся вручную, то форма знает, что было внесено изменение.