Как создавать глобальные события в калитке?

Дело простое: у меня есть несколько компонентов ajax, и я хочу обновить их, когда какое-либо действие ajax случилось. Это легко, когда все эти компоненты находятся в одном месте и до них можно добраться друг от друга.

Но если страница имеет огромную иерархию, это может быть не так тривиально, и для решения этой проблемы я хотел бы отправить какое-то глобальное событие (которое будет содержать IPartialPageRequestHandler), и все эти компоненты должны его поймать и обновить себя.

Как я могу сделать это в калитке?

На самом деле я вижу метод onEvent в классе компонента и могу получить доступ к IPartialPageRequestHandler внутри него:

public void onEvent(IEvent<?> event){
    Object payload = event.getPayload();
    if (payload instanceof IPartialPageRequestHandler) {
    ...
    }
}

Но как я могу создать глобальное событие, которое должно быть перехвачено этим методом?

Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
0
461
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете уведомить всю страницу или приложение "page.send(...)" или "application.send(...)". Wicket уже делает это для каждого события AJAX, чтобы уведомить всю иерархию страниц. См. конец этого абзаца в руководстве пользователя:

Https://ci.apache.org/projects/wicket/guide/8.x/single.html#_how_to_use_ajax_components_and_behaviors

Ответ принят как подходящий

Создайте собственное событие, например:

public class CounterUpdate
{
    private final AjaxRequestTarget target;

    /**
     * Constructor
     * 
     * @param target
     */
    public CounterUpdate(AjaxRequestTarget target)
    {
        this.target = target;
    }

    /** @return ajax request target */
    public AjaxRequestTarget getTarget()
    {
        return target;
    }
}

В вашем методе обратного вызова Ajax транслируйте его:

send(getPage(), Broadcast.BREADTH, new CounterUpdate(target));

В любом компоненте/поведении, которое заинтересовано в этом событии, выполните:

    @Override
    public void onEvent(IEvent<?> event)
    {
        super.onEvent(event);

        // check if this is a counter update event and if so repaint self
        if (event.getPayload() instanceof CounterUpdate)
        {
            CounterUpdate update = (CounterUpdate)event.getPayload();
            update.getTarget().add(this);
        }
    }

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