Wicket - 为什么 AjaxRequestTarget 对象仅在 onUpdate 方法中可用?

Wicket - why AjaxRequestTarget object is available only in onUpdate method?

我想要关于 wicket 上的 AjaxRequestTarget 的理论解释。谈论行为:要创建您自己的行为,您 必须 覆盖 onUpdate 方法,并且 可以 覆盖其他方法,如 onEvent、onBind 等。但是为什么 AjaxRequestTarget 对象仅在 onUpdate 方法中可用?

我想在其他方法中使用它(特别是在 onEvent() 中),因为我想验证表单组件。在我的测试中,onUpdate 方法无法按我想要的那样工作.. onUpdate(带有 focusout 事件)仅在模型更改时被调用...因此在我填充 TextField 时调用它,例如,但不是当它再次为空时..

onEvent 方法在这两个时刻都被调用,但我无法更新其他组件(例如用于显示对该字段的反馈消息的标签),因为 AjaxRequestTarget 在其上不可用。

AjaxFormComponentUpdatingBehavior#onUpdate() 仅在 发出 Ajax 请求时被调用

AjaxEventBehavior#onEvent() 仅在 发出 Ajax 请求时被调用

Component#onEvent() 在某些(其他,大部分时间)组件调用 Component#send(Sink, Broadcast, Payload) 时被调用。这可能发生在 Ajax 和 normal/non-Ajax 请求中。因此 AjaxRequestTarget 不用于 API.

通常 AjaxRequestTarget 由调用者作为有效负载的一部分传递,以防在 Ajax 请求中完成。这样接收器(覆盖 Component#onEvent() 的组件)可以在需要时使用它:

Caller.java:

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

Receiver.java:

@Override public void onEvent(IEvent event) {
    Object payload = event.getPayload();
    if (payload instanceOf MySpecialPayload) {
        MySpecialPayload mySpecialPayload = (MySpecialPayload) payload;
        if (doSomethingWith(mySpecialPayload) {
           AjaxRequestTarget target = mySpecialPayload.getTarget();
           target.add(this);
        }
    }
}

任何地方获取对AjaxRequestTarget 的引用的另一种方法是:RequestCycle.get().find(AjaxRequestTarget.class)。如果它非空,那么这是一个 Ajax 请求,您可以向目标添加组件,pre/append JavaScript,等等