Wicket:AjaxRequestTarget对onModelChanged
我正在wicket项目中编写一段代码,最初的开发人员在Ajax请求处理方法中大量使用了Wicket:AjaxRequestTarget对onModelChanged,wicket,wicket-7,Wicket,Wicket 7,我正在wicket项目中编写一段代码,最初的开发人员在Ajax请求处理方法中大量使用了onModelChanged()方法。一、 然而,首先,我并不十分相信这种实施方式 事实上,我想不出任何例子,其中调用target.add(…)不如调用onModelChanged方法 我是否遗漏了一些关键概念 例如: public MyComponent extends Panel { public MyComponent(String id, Component... componentsToRe
onModelChanged()
方法。一、 然而,首先,我并不十分相信这种实施方式
事实上,我想不出任何例子,其中调用target.add(…)
不如调用onModelChanged方法
我是否遗漏了一些关键概念
例如:
public MyComponent extends Panel {
public MyComponent(String id, Component... componentsToRefresh) {
add(new AjaxLink<Void>("someId") {
@Override
public void onClick(AjaxRequestTarget target) {
// some logic with model change
for(Component c: componentsToRefresh) {
c.modelChanged();
}
target.add(componentsToRefresh);
}
};
}
}
公共MyComponent扩展面板{
公共MyComponent(字符串id、组件…componentsToRefresh){
添加(新AjaxLink(“someId”){
@凌驾
公共void onClick(AjaxRequestTarget目标){
//模型变化的一些逻辑
用于(组件c:componentsToRefresh){
c、 modelChanged();
}
target.add(componentsToRefresh);
}
};
}
}
现在,有两件事我不同意,第一件是componentsToRefresh参数,第二件是(如问题所示),我们称之为
c.modelChanged()的事实
在该数组中的所有组件上。我猜这是完全不必要的,而不是构造函数中的参数,只需在MyComponent
中编写一个空函数并重写它,并在需要时将必要的组件放入其中。我建议使用Wicket事件系统。也就是说,wH一旦单击AjaxLink,您将广播一个事件:
send(getPage(), Broadcast.BREATH, new MyEventPayload(target));
这将向当前页面及其所有组件广播事件
然后,您可以在任何组件中侦听事件:
@Override
public void onEvent(IEvent event) {
Object payload = event.getPayload();
if (payload instanceof MyEventPayload) {
((MyEventPayload) payload).getTarget().add(this); // or any of my sub-components
event.stop(); // optionally you can stop the broadcasting
}
}
这样,您就不会在应用程序中耦合不相关的组件
有关更多信息,请参阅。您能否提供一些有关此应用程序中如何使用
onModelChanged()
的详细信息?我不太了解与target.add(…)的关系
。编辑过的原始问题太重,不适合只需点击按钮或文本字段中的某个字符串即可!如果您只需要更新Ajax组件的几个兄弟组件,那么您可以在SomeEvent(AjaxRequestTarget)上提供可覆盖的
并在调用者/父对象中使用它。但是,如果您需要更新页面上其他位置的组件,则建议使用Wicket事件系统。它可以更好地扩展,并且组件之间没有耦合。