我想在wicket上有关于AjaxRequestTarget的理论解释。谈论行为:创建自己的必须覆盖onUpdate方法,可以覆盖其他方法,如onEvent,onBind等。但为什么AjaxRequestTarget对象仅在 onUpdate 方法?
我想在其他方法中使用它(特别是在 onEvent()),因为我想验证表单组件。在我的测试中,onUpdate方法无法正常工作.. onUpdate(带有 focusout 事件)仅在模型被更改时被调用...所以当我填充TextField时调用它,例如,但是当它再次变空时......
onEvent方法在两个时刻都被调用,但是我无法更新其他组件(比如标签以显示该字段的反馈消息),因为AjaxRequestTarget不可用。
答案 0 :(得分:1)
AjaxFormComponentUpdatingBehavior#onUpdate()
被称为 !
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等添加组件。