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

时间:2018-02-07 19:16:21

标签: ajax components wicket behavior

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

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

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

1 个答案:

答案 0 :(得分:1)

在发出Ajax请求时,

AjaxFormComponentUpdatingBehavior#onUpdate()被称为

在发出Ajax请求时,

AjaxEventBehavior#onEvent()被称为

当某些(其他大部分时间)组件调用Component#onEvent()时,会调用

Component#send(Sink, Broadcast, Payload)。这可能发生在Ajax和普通/非Ajax请求中。因此,API中未使用AjaxRequestTarget

通常,AjaxRequestTarget作为Payload的一部分由调用者传递,以防在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)。如果它是非null,则这是一个Ajax请求,您可以向目标,pre / append JavaScript等添加组件。