我希望使用wicket在我的页面中呈现<select>
标记,但是将选项与<optgroup>
分组,这已在Separator in a Wicket DropDownChoice上讨论,但在解决方案中<optgroup>
假设<optgroup>
标记是静态的,我想要从数据库中提取选项和组。
答案 0 :(得分:4)
使用两个嵌套的转发器来迭代您的组和选项:
<select wicket:id="select">
<optgroup wicket:id="group">
<option wicket:id="option"></option>
</optgroup>
</select>
答案 1 :(得分:3)
<select wicket:id="select">
<wicket:container wicket:id="repeatingView">
<optgroup wicket:id="optGroup">
<wicket:container wicket:id="selectOptions">
<option wicket:id="option"></option>
</wicket:container>
</optgroup>
</wicket:container>
</select>
在Java代码中,“select”是一个Select; “repeatingView”是一个RepeatingView。嵌套在RepeatingView中的是一个由.newChildId()命名的WebMarkupContainer。嵌套在里面是另一个代表“optGroup”的WebMarkupContainer。第二个WMC内部是一个AttributeModifier,它为optgroup添加动态标签,以及一个处理“selectOptions”和“option”的SelectOptions。类似的东西:
Select select = new Select("select");
add(select);
RepeatingView rv = new RepeatingView("repeatingView");
select.add(rv);
for(String groupName : groupNames){
WebMarkupContainer overOptGroup = new WebMarkupContainer(rv.newChildId());
rv.add(overGroup);
WebMarkupContainer optGroup = new WebMarkupContainer("optGroup");
overOptGroup.add(optGroup);
optGroup.add(
new AttributeModifier("label",true,new Model<String>(groupName))
);
optGroup.add(
new SelectOptions<MyBean>(
"selectOptions",listOfBeanOptionsForThisGroup,new MyBeanRenderer()
)
);
}
(假设字符串直接作为组名传递,并且选项引用类型为MyBean的bean,列在变量listOfBeanOptionsForThisGroup中)
我认为将这个解决方案重构为使用更少嵌套的东西应该不难,如果有人得到建议,我会将它们编辑成答案并归功于它们。使用ListView而不是RepeatingView也应该减少代码大小。
答案 2 :(得分:2)
好的,所以目前我的解决方案就是这样:
interface Thing {
String getCategory();
}
然后:
List<Thing> thingList = service.getThings();
DropDownChoice<Thing> dropDownChoice = new DropDownChoice<Thing>("select",
thingList) {
private static final long serialVersionUID = 1L;
private Thing last;
private boolean isLast(int index) {
return index - 1 == getChoices().size();
}
private boolean isFirst(int index) {
return index == 0;
}
private boolean isNewGroup(Thing current) {
return last == null
|| !current.getCategory().equals(last.getCategory());
}
private String getGroupLabel(Thing current) {
return current.getCategory();
}
@Override
protected void appendOptionHtml(AppendingStringBuffer buffer,
Thing choice, int index, String selected) {
if (isNewGroup(choice)) {
if (!isFirst(index)) {
buffer.append("</optgroup>");
}
buffer.append("<optgroup label='");
buffer.append(Strings.escapeMarkup(getGroupLabel(choice)));
buffer.append("'>");
}
super.appendOptionHtml(buffer, choice, index, selected);
if (isLast(index)) {
buffer.append("</optgroup>");
}
last = choice;
}
};
这要求thingList
已根据类别进行排序。