DropDownChoice获得重复的选择

时间:2013-04-30 11:08:25

标签: wicket dropdownchoice

我遇到DropDownChoice(DDC)组件的问题。情况如下:我想为比赛创建一个简单的注册表页面。所以我需要一个有参与者的团队。我创建了一个表单(由不同的面板/表单组成),您可以在其中输入名称,年龄和“游戏中的位置”。然后按“添加参与者”按钮,参与者应该出现在DropDownChoice中。

我是Apache Wicket的新手,实际上我很高兴我能在屏幕上显示该表单,并看到参与者实际上已添加到DDC中。但问题出现了:DDC中的所有参与者都被“变成了”最后一个参与者。换句话说:假设我创建参与者杰夫。杰夫被添加到DDC,没问题。然后我创造迈克。当我将Mike添加到DDC并查看可用的参与者时,Jeff似乎已经变成了迈克。所以在这一点上,我的团队中有2名参与者,但是第一名,杰夫,我突然迈克也是如此。并且不仅显示的属性已经改变。参与者对象的完整内容变成迈克。

现在如果我想添加Janine,Jeff和Mike都会变成Janine,我会在我的DDC中有3个'Janine参与者'。我将添加'TeamForm'的代码,我认为这是最相关的。如果需要,我可以添加更多代码。

    package com.tvh.tournamentregistry.form;

import com.tvh.tournamentregistry.model.Participant;
import com.tvh.tournamentregistry.model.Team;
import com.tvh.tournamentregistry.panel.ParticipantPanel;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;

public class TeamForm extends Form {

    public TeamForm(String id){
        super(id);

        final Team team = new Team();
        CompoundPropertyModel<Team> teamModel = new CompoundPropertyModel<Team>(team);
        setModel(teamModel);

        add(new TextField("name"));

        Model<Participant> participantModel = new Model<Participant>();
        ChoiceRenderer<Participant> teamViewRenderer = new ChoiceRenderer<Participant>("firstname");
        final DropDownChoice<Participant> teamView = new DropDownChoice<Participant>("players",participantModel, team.getPlayers(), teamViewRenderer){

            @Override
            protected boolean wantOnSelectionChangedNotifications() {
                return true; 
            }            
        };
        add(teamView);

        final ParticipantPanel participantPanel = new ParticipantPanel("participantpanel");
        add(participantPanel);

        Button addParticipant = new Button("addparticipant"){
            @Override
            public void onSubmit() {
                Participant participant = (Participant) participantPanel.getModel().getObject();
                team.getPlayers().add(participant);
                teamView.setChoices(team.getPlayers());
                teamView.render();
                participantPanel.clear();
            }
        };

        addParticipant.setDefaultFormProcessing(false);
        add(addParticipant);

    }

    @Override
    protected void onSubmit() {
        super.onSubmit(); //To change body of generated methods, choose Tools | Templates.
    }   
}

我调试了这个小应用程序,我看到的是非常令人不安的。我把断点放在

Participant participant = (Participant) participantPanel.getModel().getObject();

添加2个参与者后,我可以看看

 team.getPlayers() 

返回参与者列表的方法。 paricipantspanel返回的模型(这是一种自定义方法,从该面板中的表单传递模型)是正确的。它返回我在表单中输入的参与者。但是,当我查看团队列表时,甚至在我的调试器到达该行之前,我可以看到所有其他参与者已经“改变”了。我没有触及列表,只是添加了新的参与者。

任何人都有吗?谢谢!如果这一点绝对不清楚,请询问!

2 个答案:

答案 0 :(得分:0)

每次添加新参与者时,ParticipantPanel必须将其模型“重新初始化”,否则其模型对象始终引用同一对象。

详细说明:

参与者a。

首次渲染时,您的面板会使用此参与者进行添加,然后将其添加到您的列表中。

之后,在重新渲染时,面板的模型对象仍然指向参与者a。因此,更改会影响旧对象。这就是为什么你的下拉列表让你的单个参与者重复了。

答案 1 :(得分:0)

尝试以下方法:

使用PropertyModel

而不是使用getter
new DropDownChoice<Participant>("players",participantModel, team.getPlayers(), teamViewRenderer)

更改为

new DropDownChoice<Participant>("players",participantModel, new PropertyModel(team, "players"), teamViewRenderer)

在ChoiceRenderer中指定idExpression

new ChoiceRenderer<Participant>("firstname");

更改为

new ChoiceRenderer<Participant>("firstname", "id");