0

我正在编写一个 wicket 项目中的代码,原始开发onModelChanged()人员在 Ajax 请求处理方法中大量使用了该方法。然而,我并不坚信这种实现方式。

事实上,我想不出任何例子,调用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并覆盖它,并在需要时将必要的组件放在那里。

4

1 回答 1

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
  }
}

这样您就不会在应用程序中耦合不相关的组件。

有关更多信息,请参阅检票指南

于 2018-11-05T13:16:23.320 回答