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を最新の状態に保ち、フォームの送信時に処理することができます。

または、Questionオブジェクトの回答を保持するString属性があり、ListView.listとListの質問の一貫性を維持する場合は、マップを必要とせずにonUpdate()で次の操作を実行できます。

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

この場合、フォームのonSubmit()で質問リストを処理するだけです。

于 2013-03-21T20:17:51.637 に答える