AbstractAjaxCallbackWithClientsideRevert.javaFullCalendar реализует оптимистичные обновления интерфейса: событие перемещается сразу при перетаскивании, а сервер может принять (ничего не меняется) или отклонить (событие возвращается в исходное положение) изменение. Этот класс реализует серверную часть этого протокола:
onEvent(AjaxRequestTarget) — подкласс реализует бизнес-логику и возвращает true (принять) или false (отклонить)$.data(document, '{uuid}', {boolean})getRevertScript())Случайный UUID (с префиксом "u") идентифицирует экземпляр обратного вызова. Этот UUID используется как ключ данных jQuery для хранения логического результата. Это предотвращает коллизии глобального состояния, когда на одной странице находятся несколько экземпляров календаря или несколько типов обратных вызовов. UUID генерируется один раз в инициализаторе поля и сохраняется на время жизни поведения.
updateAjaxAttributes() переопределяется для добавления двух слушателей:
onSuccess — выполняет скрипт успеха, который условно запускает откатonFailure — безусловно выполняет скрипт отката (сетевые/серверные ошибки всегда вызывают откат)Конкретные подклассы должны реализовать:
getRevertScript() — возвращает JavaScript-выражение FullCalendar, которое возвращает событие в исходное состояние (например, $('#calendar').fullCalendarExt('revertEvent', eventId))onEvent(AjaxRequestTarget) — бизнес-логика для принятия/отклонения изменения| Коммит | Что изменилось |
|---|---|
868d6abb7 по ceb63e8a1 | Шесть ежегодных обновлений заголовков авторских прав. Протокол двухфазной фиксации и канал состояния на основе UUID остаются стабильными — механизм корректно обрабатывает оптимистичный паттерн обновления FullCalendar и различает отклонения по бизнес-правилам (сервер возвращает false) и инфраструктурные сбои (ошибка Ajax запускает безусловный откат). |