List 带面板列表的Wicket页

List 带面板列表的Wicket页,list,wicket,panel,List,Wicket,Panel,我正在使用ApacheWicket开发一个web应用程序,我有三种类型的页面,基本上是一个编号列表。两者之间的区别在于列表中项目的显示方式。(即,一个有标题行和段落,另一个只有段落)。最终,数据将来自数据库,但目前还不可用 我想我可以通过创建一个页面来实现这一点,该页面显示一个RepeatingView,该视图从面板的ArrayList中获取项目。我会为每种类型的列表项创建不同的面板。然后我可以将前面提到的页面扩展到三个子类,每个子类对应我想要的特定类型的面板。我的思路是否正确,或者有更好的方法

我正在使用ApacheWicket开发一个web应用程序,我有三种类型的页面,基本上是一个编号列表。两者之间的区别在于列表中项目的显示方式。(即,一个有标题行和段落,另一个只有段落)。最终,数据将来自数据库,但目前还不可用


我想我可以通过创建一个页面来实现这一点,该页面显示一个RepeatingView,该视图从面板的ArrayList中获取项目。我会为每种类型的列表项创建不同的面板。然后我可以将前面提到的页面扩展到三个子类,每个子类对应我想要的特定类型的面板。我的思路是否正确,或者有更好的方法吗?

我认为您不必对页面进行子类化。就我所知,这一点都没有改变。所有更改都在面板内。因此,基本上您需要做的就是为重复视图提供不同的面板列表。你甚至不需要为它们创建不同的类,如果它们之间的差异小到显示标题与否。只需将标题设置为空字符串并将其设置为不可见


基本上是的,你的方法是正确的,也许不是我会选择的方法,但你的方法也可以…

我认为你不必对页面进行子类化。就我所知,这一点都没有改变。所有更改都在面板内。因此,基本上您需要做的就是为重复视图提供不同的面板列表。你甚至不需要为它们创建不同的类,如果它们之间的差异小到显示标题与否。只需将标题设置为空字符串并将其设置为不可见


基本上是的,您的选择是正确的,可能不是我会选择的,但您的也可以……

我发现RepeatingView对此类内容非常灵活,您不需要三个单独的页面。它只希望一个组件被添加到中继器中,而不是什么类型的组件。只要保持Wicket ID的一致性,您甚至可以混合使用带有自己标记的组件(例如面板/片段)

我也不鼓励您使用面板列表。列表包含您的数据,然后根据某个标志添加适当的视图容器,这对编程很有意义

所以,像这样的标记:

<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)));
}
RepeatingView rv=新的RepeatingView(“中继器”);
用于(数据对象o:dataList){
//您可能可以直接添加到rv,但这是常见用法
WebMarkupContainer c=新的WebMarkupContainer(rv.newChildId());
rv.添加(c);
if(简体版)
c、 增加(新短板(“列表项”,新型号(o));
其他的
c、 添加(新长面板(“列表项”,新型号(o));
}
您可以从数据库中提供相同的数据列表,然后根据当前视图添加不同的面板,而不是向页面提供面板列表


最后,您有一个页面(带有视图类型的标志)和不同的面板(或片段),用于根据每个视图类型确定数据的外观。

我发现RepeatingView对此类内容非常灵活,您不应该需要三个单独的页面。它只希望一个组件被添加到中继器中,而不是什么类型的组件。只要保持Wicket ID的一致性,您甚至可以混合使用带有自己标记的组件(例如面板/片段)

我也不鼓励您使用面板列表。列表包含您的数据,然后根据某个标志添加适当的视图容器,这对编程很有意义

所以,像这样的标记:

<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)));
}
RepeatingView rv=新的RepeatingView(“中继器”);
用于(数据对象o:dataList){
//您可能可以直接添加到rv,但这是常见用法
WebMarkupContainer c=新的WebMarkupContainer(rv.newChildId());
rv.添加(c);
if(简体版)
c、 增加(新短板(“列表项”,新型号(o));
其他的
c、 添加(新长面板(“列表项”,新型号(o));
}
您可以从数据库中提供相同的数据列表,然后根据当前视图添加不同的面板,而不是向页面提供面板列表


最后,您有一个页面(带有视图类型的标志)和不同的面板(或片段),根据每个视图类型显示数据的外观。

Inportant:中继器内的wicket:id必须命名为“listItem”,否则它将不起作用重要的是:中继器内的wicket:id必须命名为“listItem”,否则就不行了