我遇到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返回的模型(这是一种自定义方法,从该面板中的表单传递模型)是正确的。它返回我在表单中输入的参与者。但是,当我查看团队列表时,甚至在我的调试器到达该行之前,我可以看到所有其他参与者已经“改变”了。我没有触及列表,只是添加了新的参与者。
任何人都有吗?谢谢!如果这一点绝对不清楚,请询问!
答案 0 :(得分:0)
每次添加新参与者时,ParticipantPanel必须将其模型“重新初始化”,否则其模型对象始终引用同一对象。
详细说明:
参与者a。
首次渲染时,您的面板会使用此参与者进行添加,然后将其添加到您的列表中。
之后,在重新渲染时,面板的模型对象仍然指向参与者a。因此,更改会影响旧对象。这就是为什么你的下拉列表让你的单个参与者重复了。
答案 1 :(得分:0)
尝试以下方法:
使用PropertyModel
而不是使用getternew 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");