我正在使用Apache Wicket开发Web应用程序,我有三种类型的页面,基本上是编号列表。每个之间的区别在于列表中的项目是如何显示的。 (即一个有一个标题行和一个段落,另一个只有段落)。最终,数据将来自数据库,但目前无法使用。
我想我可以通过创建一个显示一个RepeatingView的页面来实现这一点,该窗口从Panels的ArrayList中获取它的项目。我会为每种类型的列表项创建一个不同的Panel。然后我可以将上述页面扩展为三个子类,每个子类对应我想要的每种特定类型的面板。我是在正确的轨道上,还是有更好的方法来做到这一点?
答案 0 :(得分:5)
我发现RepeatingView对这类事情非常灵活,你不应该需要三个单独的页面。它只希望将一个组件添加到转发器中,而不是哪种组件。只要您保持Wicket ID一致,您甚至可以混合使用自己的标记的组件(例如Panel / Fragment)。
我也不鼓励你使用面板列表。它只是为列表提供良好的编程意义,以包含数据,然后根据某些标志添加适当的视图容器。
所以,这样的标记:
<div wicket:id="repeater">
<div wicket:id="listItem" />
</div>
使用类似的东西:
RepeatingView rv = new RepeatingView("repeater");
for (DataObject o : dataList) {
// You can probably add to the rv directly, but this is the common usage
WebMarkupContainer c = new WebMarkupContainer(rv.newChildId());
rv.add(c);
if (shortVersion)
c.add(new ShortPanel("listItem", new Model<DataObject>(o)));
else
c.add(new LongPanel("listItem", new Model<DataObject>(o)));
}
您可以从数据库中提供相同的数据列表,然后根据当前视图添加不同的面板,而不是向页面提供面板列表。
最后,您有一个页面(带有视图类型的标志)和不同的面板(或片段),用于根据每种视图类型查看数据的方式。
答案 1 :(得分:0)
我认为您不必将您的Page子类化。据我所知,这一点根本没有变化。所有更改都在面板内。所以基本上你需要做的就是为你的重复视图提供不同的面板列表。如果差异与标题不同,您甚至不需要为这些创建不同的类。只需将标题设置为空字符串并将其设置为不可见...
基本上是的,你是在正确的轨道之一,也许不是我选择的那个,但你的也会工作......