2013-04-30 103 views
0

我有一個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(這是一種自定義方法,從該面板中的表單傳遞模型)返回的模型是正確的。它返回我在表單中輸入的參與者。但是當我查看團隊列表時,甚至在調試器到達該線路之前,我可以看到所有其他參與者已經「更改」了。而且我沒有觸及清單,只添加了新的參與者。

雖然有人嗎?謝謝!如果這是絕對不清楚的,請問!

回答

0

每次添加新參與者時,ParticipantPanel的模型必須「重新初始化」,否則其模型對象始終會引用同一對象。

詳細內容:

參與者a。

在第一次渲染時,您的面板使用此參與者等添加,它將它添加到您的列表。

之後,在重新渲染時,面板的模型對象仍指向參與者a。所以更改會影響舊對象。這就是爲什麼你的下拉菜單重複你的單一參與者。

+0

感謝grotori!我在參與者面板中創建了一個自定義方法,給定了一個新的模型實例。我也嘗試改變模型對象,這也起作用。但是這兩種解決方案中的哪一種會是更好的做法? – anothernoc 2013-04-30 12:15:14

+0

我會在添加後更改面板的模型對象。 – 2013-04-30 12:23:46

+0

啊,很好:)。我有同樣的意見。再次感謝! – anothernoc 2013-04-30 12:27:34

0

嘗試以下操作:

而不是使用吸氣劑,使用PropertyModel

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