Wicket:AjaxRequestTarget对onModelChanged

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

我正在wicket项目中编写一段代码,最初的开发人员在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);
            }
        };
    }
}
公共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事件系统。它可以更好地扩展,并且组件之间没有耦合。