Wicket - DropDownChoice POJO для модели недвижимости

Маленькая проблема с DropDownChoice. Я строю DropDownChoice со списком объектов. Взять, к примеру:

public MyClass 
  private String code;
  private String description;
[...]

чем взять другой объект

public FormModelObject
   private String code;

Я могу легко построить DropDownChoice, выбирая, что показать (свойство description) и что получить (свойство code), используя ChoiceRender.

К сожалению, DropDownChoice возвращает весь объект (MyClass), и я не могу установить свойство Code внутри FormModelObject (он просто запускает метод toString() в MyClass).

Как я могу получить его без использования Ajax?

Спасибо

4 ответа

Решение

Ну, вы могли бы переопределить метод onModelChanged() DropDownChoice и обновить ResidenceZipCode с новым значением. Что-то вроде:

DropDownChoice<City> drop = new DropDownChoice<City>("residenceZipCode",new Model(), cityList,new ChoiceRenderer<City>("name", "zipcode")){
     onModelChanged(){
       String newZipCode =  (String)PropertyResolver.getValue("zipCode",getModelObject());
       PropertyResolver.setValue("residenceZipCode", res, newZipCode, new  PropertyResolverConverter());
     }

};

DropDownChoice должен иметь свою собственную модель.

Попробуйте с цепочкой моделей. Вам следует заменить код переменной формы моделью свойства, построенной следующим образом:

//this is the model of your DropDownChoice
Model<MyClass> myModel = new Model<MyClass>();
//...

PropertModel myCode = new PropertModel(myModel, "code");

Теперь используйте myCode вместо кода в вашей форме.

Взгляните на аргумент типа DDC: в вашем случае это City, поэтому DDC работает с объектами City.

Если вы этого не хотите, измените тип, и компилятор поможет вам:

DropDownChoice<String> drop = new DropDownChoice<String>("residenceZipCode",zipCodesList,new CityChoiceRenderer());

class CityChoiceRenderer implements IChoiceRenderer<String> {
  Object getDisplayValue(String zipCode) {
    return zipCodeToName(zipCode);
  }

  String getIdValue(String zipCode, int index) {
    return zipCode;
  }
}

Лучше написать код:

    class City {
      private String zipCode;
      private String name;
    }

    class Residence {
      private String residenceZipCode;
    }

protected Residence res;

public ResidenceForm() {
  super("form", new CompoundPropertyModel<Residence>(res));

  List<City> cityList = someManager().loadAllCity();

  DropDownChoice<City> drop = new DropDownChoice<City>("residenceZipCode",cityList,new ChoiceRenderer<City>("name", "zipcode"));
add(drop);

Сейчас. Я не могу изменить место жительства или город и не могу написать код внутри метода кнопки onSubmit.

Что я хочу, так это почтовый индекс внутри резиденции. Теперь я получаю эквивалент City.toString()

Другие вопросы по тегам