我正在处理一个小门项目中的代码,原始开发人员在Ajax请求处理方法中大量使用了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);
}
};
}
}
现在,我有些不同意,第一件事是componentsToRefresh参数,第二件事是(正如该问题所暗示的那样),事实上我们在其中的所有组件上都调用了c.modelChanged()
该数组。我的猜测是,这完全没有必要,而应该在MyComponent
中编写一个空函数并覆盖它,并在需要时将必要的组件放在其中。
答案 0 :(得分:1)
我建议改用Wicket Event系统。也就是说,每当单击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
}
}
这样,您就不会在应用程序中耦合不相关的组件。
有关更多信息,请参见Wicket Guide。