如何在 wicket 中创建全局事件?

How to create global events in wicket?

情况很简单:我有几个 ajax 组件,我想在某些 ajax 操作执行时更新它们 发生了。当所有这些组件都在同一个地方并且它们可以一个接一个地到达时,这很容易。

但是如果页面有一个巨大的层次结构,这就不是那么简单了,为了解决这个问题,我想发送一些全局事件(它将包含一个 IPartialPageRequestHandler),所有这些组件都应该捕获它并自行更新。

如何在 wicket 中执行此操作?

实际上我在组件 class 中看到了 onEvent 方法,我可以访问其中的 IPartialPageRequestHandler:

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

但是我如何创建应该被这种方法捕获的全局事件?

您可以通知整个页面或应用程序 '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));

在任何对此活动感兴趣的Component/Behavior中:

    @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);
        }
    }