我已经在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中,它还表示不向组件创建工厂......现在它很奇怪,因为上面的代码片段就像工厂一样工作,而页面上有工厂来构建组件。即使创建表单组件的方法是私有的,只有表单才能使用它,并且可重用性丢失。因此,考虑到第二个建议,这些方法(即隐式组件工厂)不是一个好习惯。
欢迎任何关于如何创建复杂组件的说明(使用一些代码示例会更好)。
提前致谢。
答案 0 :(得分:2)
我们使用这种方法,它可以正常工作。
您展示的方法不是工厂。查看文档中的示例。
它们有类似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必须相同。这简化了代码导航。