Обработка ListView внутри формы - PullRequest
2 голосов
/ 11 декабря 2011

Пожалуйста, обратите внимание на следующую регистрацию:

<form wicket:id="form">
  <div wicket:id="fooList">                                        
    <input wicket:id="fooList.quxField" type="text" size="10"/>
  </div>                
  <button wicket:id="submit"><wicket:message key="submitText"/></button>    
</form>

И эти два класса (я полагаю, сеттеры, геттеры и т. Д.)

class FooClazz {        
    String quxField;
}

class BarClazz {
    List<FooClazz> fooList;
}

И эта форма (модели обернуты в CompoundPropertyModel):

class BarForm extends Form<BarClazz> {
  public BarForm(String id,final IModel<BarClazz> model){
    super(id,model);
    add(new ListView<FooClazz>("fooList"){
      @Override
      protected void populateItem(final ListItem<FooClazz> item){
        item.add(new TextField<String>("fooList.quxField"));
      }                   
    }
  }
}

Теперь приведенный выше код генерирует для меня исключение времени выполнения:

2011-12-11 16:33:46 ERROR [org.apache.wicket.DefaultExceptionMapper] Unexpected error occurred org.apache.wicket.WicketRuntimeException: The expression 'quxField' is neither an index nor is it a method or field for the list class java.util.ArrayList

Я могу изменить TextField, добавив в него следующую модель:

item.add(new TextField<String>("fooList.quxField", new Model<String>(model.getObject().getFooList().getQuxField())));

Это устраняет ошибку, но когда я отправляю форму (с Ajaxbutton), я никогда не вижу значения, введенные в поля формы.

Так, как я могу сохранить модели TextField, связанные с моей моделью формы? Я пропускаю очевидное? (Это, конечно, просто очень сокращенная версия моего исходного кода ...)

Необходимо добавить: все мои модели обернуты в CompoundPropertyModels.

Заранее спасибо за любые советы, как это исправить.

1 Ответ

5 голосов
/ 11 декабря 2011

Я нашел это.Мне нужно включить модель для TextField, которая имеет реализации как для getObject (), так и, конечно, setObject ().Так что мне действительно не хватало очевидного.

@Override
protected void populateItem(final ListItem<Taste> item) {
    final TextField<String> quxField = new TextField<String>("tastes.quxField", new Model<String>() {
        @Override
        public String getObject() {
            return item.getModel().getObject().getquxField();
        }

        @Override
        public void setObject(final String value) {
            item.getModel().getObject().setquxField(value);
        }
    });
    item.add(quxField);
}
...