Vaadin 23: addPropertyChangeListener для изменений JavaScript
Предназначено : в приложении Vaadin 23 я хотел бы получать информацию об изменении значения атрибута HTML.
Что я пробовал : я создал эту формулу ввода:
// Text input field
Input input = new Input();
input.setId("myInputField");
Element textInput = input.getElement();
// Change listener for property "value"
// Works well for manual input
// BUT doesn't work for JavaScript changes
textInput.addPropertyChangeListener("value", "change",
e -> {System.out.println(e.getValue());}
);
// Button that changes the value of attribute "value"
Button button = new Button("Change value");
button.addClickListener(e -> {UI.getCurrent().getPage().executeJs(
"document.getElementById('myInputField').setAttribute('value','hello');"
);});
this.add(input, button);
Что работает : когда пользователь вводит «что-то» в поле ввода, сервер выводит «что-то» на консоль. Это задумано и соблюдается. ХОРОШО.
Что НЕ работает : когда пользователь нажимает кнопку, содержимое поля ввода «привет» (ОК). Но PropertyChangeListener не запускает событие, поэтому сервер ничего не выводит на консоль.
Вопрос : Есть ли способ заставить PropertyChangeListener запустить событие, даже если значение атрибута было изменено с помощью JavaScript?
1 ответ
Я вижу здесь две проблемы.
Во-первых, слушатель изменения свойства на стороне сервера в Vaadin Flow должен запускаться событием на стороне клиента. В
Во-вторых, как указано в комментариях, вы должны изменить свойство, а не атрибут. В большинстве случаев атрибут и свойство с одинаковым именем синхронизируются, но значение ввода является исключением. Здесь атрибут является начальным значением, а свойство — фактическим значением. Остаются неизменными, если вы меняете только атрибут, но расходятся после того, как пользователь редактирует через пользовательский интерфейс или если свойство изменено.