EN · DE · RU · FR · ES

#2790: AbstractAjaxCallbackWithClientsideRevert.java

projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/callback/AbstractAjaxCallbackWithClientsideRevert.java Абстрактное поведение Wicket (FullCalendar Ajax с откатом) · projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/callback/AbstractAjaxCallbackWithClientsideRevert.java 82 строки · 35 кода · 33 комментария · 14 пустых
Абстрактное поведение Ajax-обратного вызова для взаимодействий с FullCalendar, требующих отката на стороне клиента при сбое — в частности, операций перетаскивания и изменения размера. Когда пользователь перетаскивает или изменяет размер события календаря, FullCalendar немедленно перемещает/изменяет размер события в интерфейсе и отправляет Ajax-обратный вызов на сервер. Если сервер отклоняет изменение (например, из-за конфликта расписания или нарушения бизнес-правил), это поведение отправляет обратно на клиент скрипт отката, который возвращает событие в исходное положение. Механизм использует комбинацию слушателей Ajax-вызовов Wicket (onSuccess/onFailure) и атрибута данных jQuery для передачи решения сервера (принять/отклонить) логике отката на стороне клиента.

Архитектура

Протокол двухфазной фиксации

FullCalendar реализует оптимистичные обновления интерфейса: событие перемещается сразу при перетаскивании, а сервер может принять (ничего не меняется) или отклонить (событие возвращается в исходное положение) изменение. Этот класс реализует серверную часть этого протокола:

  1. При Ajax-запросе вызывается onEvent(AjaxRequestTarget) — подкласс реализует бизнес-логику и возвращает true (принять) или false (отклонить)
  2. Результат сохраняется в атрибуте данных jQuery на документе: $.data(document, '{uuid}', {boolean})
  3. При успешном Ajax-запросе скрипт успеха читает атрибут данных — если false, он выполняет скрипт отката (предоставляемый абстрактным методом getRevertScript())
  4. При сбое Ajax (сетевая ошибка, исключение сервера) скрипт отката выполняется всегда
  5. Атрибут данных очищается после оценки

Канал состояния на основе UUID

Случайный UUID (с префиксом "u") идентифицирует экземпляр обратного вызова. Этот UUID используется как ключ данных jQuery для хранения логического результата. Это предотвращает коллизии глобального состояния, когда на одной странице находятся несколько экземпляров календаря или несколько типов обратных вызовов. UUID генерируется один раз в инициализаторе поля и сохраняется на время жизни поведения.

Интеграция слушателя Ajax-вызовов

updateAjaxAttributes() переопределяется для добавления двух слушателей:

Контракт подкласса

Конкретные подклассы должны реализовать:

История Git

КоммитЧто изменилось
868d6abb7 по ceb63e8a1Шесть ежегодных обновлений заголовков авторских прав. Протокол двухфазной фиксации и канал состояния на основе UUID остаются стабильными — механизм корректно обрабатывает оптимистичный паттерн обновления FullCalendar и различает отклонения по бизнес-правилам (сервер возвращает false) и инфраструктурные сбои (ошибка Ajax запускает безусловный откат).