【问题标题】:Wicket : Submitting data with a listview inside a formWicket:在表单内使用列表视图提交数据
【发布时间】:2013-03-21 01:28:12
【问题描述】:

我有以下问题:

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

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


        }
    };

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

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

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

【问题讨论】:

标签: forms listview dynamic wicket


【解决方案1】:

对于这些情况,我所做的是为每个问题维护一个带有所选选项的哈希图。我用 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() 中的问题列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多