Wicket:使用表单内的列表视图提交数据

时间:2013-03-21 01:28:13

标签: forms listview dynamic wicket

我有以下问题:

想象一下wicket列表视图,看起来像这样:

ListView<Question> lvQuestion = new ListView<Question>("lvQuestion",
            questions) {

        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(ListItem<Question> item) {
            Question q = item.getModelObject();
            item.add(new Label("question", q.getQuestion()));

            List<String> possibleAnswers = getFromDb();

            q.setPossibleAnswers(possibleAnswers);
            if(q.getComponent().equals("dropDown")){
                item.add(new DropDownPanel("questionComponent", q));
            }


        }
    };

此列表视图是在表单组件中创建的;我需要做的是使用此列表视图回答每个问题并将其记录在数据库中。

问题是,我不知道会有多少下拉面板,所以总会有一组动态的问题返回。

是否有办法确保在提交父表单时将列表视图中的每个模型提交到数据库。

1 个答案:

答案 0 :(得分:0)

我为这些情况做的是为每个问题维护一个带有所选选项的hashmap。我用AjaxFormComponentUpdatingBehavior更新它,如下所示: 首先,声明&amp;初始化地图(可能有一种更有效的方法)

Map<Question, String> qMap = new HashMap<>();
for(Question q : questions) {
    qMap.put(q, "");
}

然后,更新ListView中的地图(您可能希望在初始化时将q设置为final)

if(q.getComponent().equals("dropDown")) {
    DropDownPanel ddp = new DropDownPanel("questionComponent", q);
    ddp.add(new AjaxFormComponentUpdatingBehavior("onchange") {
        @Override
        protected void onUpdate(AjaxRequestTarget art) {
            String answer = (String) getFormComponent().getConvertedInput();
            qMap.put(q, answer);
        }
    }
    item.add(ddp);
}

这使您可以使qMap保持最新状态,并在提交表单时对其进行处理。

或者,如果你有一个String属性来保存Question对象的答案,并确保ListView.list和List问题保持一致,你可以在onUpdate()中执行以下操作而不需要map:< / p>

q.setAnswer(answer);
questions.set(item.getIndex(), q);

在这种情况下,您只需处理表格的onSubmit()中的问题列表。