Изменение поведения проверки ввода веб-компонентов Vaadin 24 Flow onblur

Поведение того, как входные элементы в форме запускают проверку, изменилось между Vaadin 23 и 24. Под проверкой я подразумеваю либо цепочку формы, bean-компонент с аннотациями Bean Validation API и связующим BeanValidationBinder, либо некоторые ограничения для поля ввода.

В V24 событие размытия мгновенно запускает проверку, прежде чем оно первоначально проверялось только при изменении значения.

Примеры использования BeanValidationBinder в формах ValidationView:

В живых демонстрационных примерах ограничений полей в документации Vaadin это также воспроизводится:

В этой демонстрации BeanValidationBinder не используется, но принцип должен быть тот же.

  • Нажмите на текстовое поле «Номер телефона».
  • Не вводите никаких данных.
  • Выйдите из текстового поля с помощью табуляции или мыши.

Посмотрите, как текстовое поле становится красным в V24 без ввода данных. В предыдущей версии он стал красным только в том случае, если перед выходом вы ввели что-то неправильно.

Проблема https://github.com/vaadin/platform/issues/3066 , похоже, является подходящим местом этого изменения.

Не могу найти упоминаний об этом в различных местах изменений на V24.

Вопрос о том, лучше ли это новое поведение с точки зрения UX, может быть спорным. Однако он может сломать существующие приложения со сложными формами.

Рассмотрим форму с N входами, компонент со строковыми полями и аннотациями @NotEmpty и BeanValidationBinder, инициализированный с помощью методаbindInstanceFields(). При загрузке фокус имеет первый вход. Пока все в порядке, все в порядке. Но если пользователь напрямую щелкает третий ввод в форме, отображается сообщение об ошибке первого ввода, которое может выглядеть неинтуитивно.

Или, если вы используете пользовательские входные данные, например, входные данные с кнопкой поиска, где нажатие на кнопку переносит фокус с входных данных и запускает проверку с ошибкой «пустое значение» еще до того, как пользователь сможет что-то выбрать. Другой сценарий — зависимости в формах, где кнопка, расположенная ниже по порядку табуляции, должна запускать проверку некоторых предыдущих входных данных. В зависимости от того, где находится фокус при нажатии кнопки, это может вызвать непредвиденные ошибки.

Глядя в основном на com.vaadin.flow.comComponent.textfield.TextField, я не вижу какого-либо общего способа избежать проверки при размытии. Перезаписать все необходимые веб-компоненты или предоставить собственный BeanValidationBinder возможно, но это кажется неправильным.

Кажется, существует потребность в деактивации проверки размытия в https://github.com/vaadin/web-comComponents/issues/354 с точки зрения использования без потока, что может быть полезно, если оно когда-либо будет подхвачено и реализовано.

Вопросы: можно ли как-то добиться «старого» поведения проверки в приложении V24? Есть ли планы реализовать для этого какую-то обратную совместимость? Можно ли считать это ошибкой и проблема будет уместной?

3 ответа

Вы не сравниваете одно и то же: в демо-версии V24, на которую вы ссылаетесь, поле также настроено как «обязательное» (обратите внимание на маленькую синюю точку после метки). Выход из обязательного поля уведомляет пользователя о том, что ввод отсутствует. Такое же поведение наблюдается в V23 (и, скорее всего, в V14).

Краткое изложение возможных обходных путей

Поскольку подтверждено, что эта проблема известна и что Vaadin собирается реализовать проверку только для «грязных» полей в #6146, возможно, просто необходимо иметь временное решение для текущих выпусков V24. Во время оценки я сталкивался с разными подходами.

  • Реализуйте свой собственный Binder. Кажется а) сложным и б) даже невозможным. AFAICT вы получаете только DomEvents, которые сообщают Binder о необходимости проверки. С первого взгляда я не смог понять, как получить тип события и узнать, могло ли значение быть изменено.
  • Реализуйте свои собственные веб-компоненты, не создавая событий проверки onblur. Кажется, много работы и очень неудобно для будущих обновлений и т. д.
  • Не трогайте логику проверки, обрабатывайте желаемый вид только с помощью CSS. Настройте класс CSS, например, «noerror», добавив его для необходимых компонентов. Сделайте так, чтобы даже если есть ошибка, просто не показывать ее. После первого события ValueChangeListener удалите этот класс, и пусть компонент ведет себя как по умолчанию. Немного утомительно возиться с атрибутами CSS, возможно, потребуются корректировки при будущих изменениях. Однако это кажется наименее болезненным подходом.

Это известная проблема , возникшая после согласования времени проверки на стороне сервера с веб-компонентом, где быстрая проверка размытия на сегодняшний день считается ожидаемым поведением.

В настоящее время мы рассматриваем предложение изменить поведение по умолчанию, чтобы поле проверялось на размытие только после того, как пользователь действительно взаимодействовал с ним, например, набрав что-нибудь. Для получения дальнейших обновлений перейдите по ссылке https://github.com/vaadin/web-comComponents/issues/6146.

Другие вопросы по тегам