Wicket - 实现复杂组件的最佳方式

Wicket - Best way to implement complex components

我已经在 Wicket 中启动了一个包含很多表单的应用程序,所以我正在寻找如何编写良好、可重用且主要易于维护的组件。

从指南中阅读 best practices 它说要分离更复杂的组件(在示例中是带有标签和面板的表单)使其独立定义一个方法来创建每个表单组件:

public class BlogEditPage extends WebPage {
...
    private Form<Blog> createBlogEditForm() {
        Form<Blog> form = newBlogEditForm();
        form.add(createHeadlineField());
        form.add(createContentField());
        form.add(createTagField());
        form.add(createViewRightPanel());
        form.add(createCommentRightPanel());
        form.setOutputMarkupId(true);
        return form;
    }

    // more methods here
}

起初我觉得很奇怪,但考虑到每个组件都有自己的复杂性、验证规则,这是有道理的(这样它也可以很容易地重用)。

但在 same section 中它还说不要为组件创建工厂.. 现在很奇怪,因为上面的代码片段就像表单工厂一样工作,而页面有工厂来形成组件。即使创建表单组件的方法是私有的,也只有表单才能使用它,并且失去了可重用性。所以考虑到第二个建议,这些方法(即隐式组件工厂)不是一个好的做法。

欢迎任何关于如何创建复杂组件的说明(有一些代码示例会更好)。

提前致谢。

我们使用这种方法并且效果很好。

你展示的方法不是工厂。查看文档中的示例。 他们有类似 LabelFactory.createLabel(id, model); 的内容,但您上面显示的方法并非如此。

在您显示的方法中删除单词 create。我们的组件如下所示:

   private AjaxFallbackDefaultDataTable table() {
      List<AbstractColumn> columns = new ArrayList<>();
      columns.add(new PropertyColumn(Model.of("Login"), "login", "login"));
      columns.add(new PropertyColumn(Model.of("First Name"), "firstName", "firstName"));
      columns.add(new PropertyColumn(Model.of("Last Name"), "lastName", "lastName"));
      AjaxFallbackDefaultDataTable dt = new AjaxFallbackDefaultDataTable("table", columns, new UserProvider(), 50);
      dt.setOutputMarkupPlaceholderTag(true);
      return dt;
   }

没有工厂。我们使用的另一个约定是方法的名称和组件的 wicket id 必须相同。这简化了代码中的导航。