1

我有以下问题:

想象一个看起来像这样的检票口列表视图:

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));
            }


        }
    };

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

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

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

4

1 回答 1

0

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

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() 中执行以下操作而无需映射:

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

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

于 2013-03-21T20:17:51.637 回答