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 必须相同。这简化了代码中的导航。
我已经在 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 必须相同。这简化了代码中的导航。