小门:AjaxRequestTarget与onModelChanged

时间:2018-11-05 10:45:14

标签: wicket wicket-7

我正在处理一个小门项目中的代码,原始开发人员在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中编写一个空函数并覆盖它,并在需要时将必要的组件放在其中。

1 个答案:

答案 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