3.5.3. Маркер ввода#

3.5.3.1. Характеристики#

  • Маркер ввода обеспечивает синхронизацию моментов начала и завершения редактирования данных между элементами формы. Редакторы и кнопки, размещённые на форме, не знают друг о друге, но все знают о текущем маркере ввода.

    Note

    Попытка сделать маркер ввода единым для всего приложения привела к ошибке. Если открыть 2 MDI-формы. Начать редактирование во второй форме. Переключиться на первую форму и попытаться начать редактирование. Во второй, не активной форме, произойдёт ошибка, т.к. произойдёт закрытие маркера ввода и завершение редактирование неактивного редактора.

  • Маркер ввода запрашивается редактором у своего контроллера в момент получения фокуса или начала пользовательского ввода (определяется разработчиком frontend’а компонента).

    Tip

    Внешний компонент, может обладать несколькими полями ввода. При этом, по-умолчанию, маркер ввода выдаётся на весь компонент. Если запросить маркер ввода несколько раз подряд, не закрывая предыдущий маркер, вы получите ссылку на тот же маркер ввода.

  • Если в момент запроса маркера, маркер выделен другом редактору, производится попытка закрытия текущего маркера. При закрытии маркера ввода, редактору-владельцу маркера посылается уведомление о необходимости завершения редактирования и отправки на сервер изменённых данных.

    Note

    При нажатии на кнопку панели управления или пункта меню, выполняется попытка закрытия текущего маркера ввода. Если редактор, которому выделен маркер ввода, содержит изменённые данные, он выполнит их сохранение. На сервер будут отправлены 2 команды:

    • команда на сохранение изменённых данных.

    • команда на выполнение операции выборки, соответствующей нажатой кнопке.

    Если первая команда завершится ошибкой, вторая команда будет отменена, выполнения операции не произойдёт.

  • Получив ссылку на ExtInputMarker, редактор подписывается на события маркера, для получения уведомления о закрытии, и может выполнять редактирование данных.

3.5.3.2. Взаимодействие с фокусом ввода#

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

  • Маркер ввода запрашивается редактором при получении фокуса или перед началом редактирования данных.

    Фокус ввода перемещается при любой навигации по элементам приложения.

    Note

    Потеря редактором фокуса ввода не приводит к потере (закрытию) маркера ввода, если это не указано в js-коде редактора.

  • Запрос и закрытие маркера ввода являются асинхронным действиями, т.к. могут породить обращение к серверу (сохранение данных соседним редактором).

    Js-метод браузера HTMLElement.focus() - синхронный. Фокус немедленно переместится на элемент.

  • Редактор-владелец маркера может отменить закрытие маркера, например, при некорректном значении в редакторе.

    На события перемещения фокуса ввода focus и blur браузера не возможно влиять: отменить получение или потерю фокуса элементом.

    Tip

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