wicket </optgroup>中的动态<optgroup>支持

时间:2011-12-15 14:04:02

标签: java forms wicket optgroup

我希望使用wicket在我的页面中呈现<select>标记,但是将选项与<optgroup>分组,这已在Separator in a Wicket DropDownChoice上讨论,但在解决方案中<optgroup>假设<optgroup>标记是静态的,我想要从数据库中提取选项和组。

3 个答案:

答案 0 :(得分:4)

使用两个嵌套的转发器来迭代您的组和选项:

<select wicket:id="select">
    <optgroup wicket:id="group">
        <option wicket:id="option"></option>
    </optgroup>
</select>

答案 1 :(得分:3)

我有基本相同的问题。在寻找一个简短的解决方案几天之后,我相信最好的方法是使用中继器,容器和AttributeModifier 来实现最大的灵活性,例如:

<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已根据类别进行排序。