【问题标题】:Wicket: AjaxRequestTarget vs onModelChanged检票口:AjaxRequestTarget 与 onModelChanged
【发布时间】:2018-11-05 10:45:13
【问题描述】:

我正在编写 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);
            }
        };
    }
}

现在,有几件事我不同意,第一个是 componentsToRefresh 参数,第二个是(正如问题所暗示的那样),我们在该数组中的所有组件上调用了 c.modelChanged() .我的猜测是它完全没有必要,而不是构造函数中的参数,应该只在MyComponent 中编写一个空函数并覆盖它,并在需要时将必要的组件放在那里。

【问题讨论】:

  • 您能否详细介绍一下onModelChanged() 在此应用程序中是如何使用的?我不太明白与target.add(...) 的关系。
  • 编辑过的原始问题

标签: wicket wicket-7


【解决方案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

【讨论】:

  • 对于单击按钮或文本字段中的某些字符串来说太重了
  • 同意!如果您只需要更新一些 Ajax 组件的兄弟组件,那么您可以提供可覆盖的 onSomeEvent(AjaxRequestTarget target) 并在调用者/父级中使用它。但如果您需要更新页面上其他地方的组件,则建议使用 Wicket Event 系统。它可以更好地扩展,并且组件之间没有耦合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2023-03-17
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多