我有一個DropDownChoice(DDC)組件的問題。情況如下:我想爲比賽創建一個簡單的註冊表頁面。所以我需要一個有參與者的團隊。我創建了一個表單(這是一個不同的面板/表單組成),您可以在其中輸入姓名,年齡和「在遊戲中的位置」。然後按「添加參與者」按鈕,參與者應出現在DropDownChoice中。DropDownChoice獲取重複的選擇
我是Apache Wicket的新手,實際上我很高興我得到了在屏幕上顯示的表單,並且看到參與者實際上被添加到了DDC中。但是問題在於:DDC中的所有參與者都變成了最後一個參與者。換句話說:假設我創建了參與者Jeff。傑夫被添加到DDC,沒問題。然後我創造邁克。當我將Mike添加到DDC並查看可用的參與者時,Jeff似乎已經變成了Mike。所以在這一點上,我的團隊中有兩個參與者,但第一個參與者傑夫,我突然也是邁克。這不僅是顯示的屬性發生了變化。這是Participant對象的完整內容變成了Mike。
現在,如果我想添加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(這是一種自定義方法,從該面板中的表單傳遞模型)返回的模型是正確的。它返回我在表單中輸入的參與者。但是當我查看團隊列表時,甚至在調試器到達該線路之前,我可以看到所有其他參與者已經「更改」了。而且我沒有觸及清單,只添加了新的參與者。
雖然有人嗎?謝謝!如果這是絕對不清楚的,請問!
感謝grotori!我在參與者面板中創建了一個自定義方法,給定了一個新的模型實例。我也嘗試改變模型對象,這也起作用。但是這兩種解決方案中的哪一種會是更好的做法? – anothernoc 2013-04-30 12:15:14
我會在添加後更改面板的模型對象。 – 2013-04-30 12:23:46
啊,很好:)。我有同樣的意見。再次感謝! – anothernoc 2013-04-30 12:27:34