Wicket 1.8 DropDownChoice не показывает правильный объект модели - PullRequest
0 голосов
/ 14 марта 2019

У меня проблема с DropDownChoice и его моделью.HTML-код представляет собой модальное окно, с помощью которого пользователь может редактировать настройки объекта: первый DDC изменяет список второго, когда изменяется его модель, и все работает нормально.Проблема состоит в том, что оба DDC не показывают сохраненное значение, но они показывают первый элемент в связанном списке.Вот некоторый код:

private DropDownChoice<Sala> salaDDC;
private DropDownChoice<Sede> sedeDDC;
private ArrayList<Sala> listaSale;

private Sala sala = null; //they both get correctly initialized afterwards
private Sede sede = null;
[...]
//first DDC, with the "sede" list. 
//Its model is based on class Sede, and its list of choices is sediList, which is constant

    form.addOrReplace(sedeDDC = new DropDownChoice<>("sedeDDC", Model.of(sede), sediList);
    sedeDDC.add(new AjaxFormComponentUpdatingBehavior("change") {
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            listaSale = listSalePerSede.get(sedeDDC.getModelObject().getId());
            if (null != listaSale) {
                if (listaSale.isEmpty()) {
                    listaSale = new ArrayList<>();
                }
            } else {
                listaSale = new ArrayList<>();
            }
            target.add(salaDDC);
        }
    });
    sedeDDC.setDefaultModelObject(sede);
    sedeDDC.setModelObject(sede);

//second DDC, representing the "sala" list 
//Its model is based on Sala class, and its list of choices changes if the 
//other DDC model object changes, hence the PropertyModel model

    form.addOrReplace(salaDDC = new DropDownChoice<>("salaDDC", Model.of(sala), new PropertyModel(this, "listaSale")));
    salaDDC.setDefaultModelObject(sala);
    salaDDC.setModelObject(sala);
    salaDDC.setOutputMarkupId(true);

Итак, предположим, что у вас есть такая ситуация:

  • sede1 (содержит sala1, sala2, sala3)
  • sede2 (содержитsala4, sala5)

«Седе» означает «отдел», а «Сала» - это комната, поэтому для каждого отдела вы можете иметь список разных комнат.

Если пользователь пытается отредактировать объект с настройками «sede1» и «sala2», диалоговое окно загрузится с первым DDC, показывающим «sede1» (это верно, только случайно), и вторым, показывающим «sala1»(потому что это первый из списка, связанный с "sede1"), а не "sala2".Точно так же, если настройки объекта - «sede2» и «sala5», DDC будет отображать соответственно «sede1» (первый из списка «sede») и «sala4» (первый элемент списка, связанный с «sede2»), в то время какмодельный объект "sala5".Итак, на данный момент пользователь должен заново установить уже сохраненные значения для этих двух полей при редактировании связанного объекта, и это нехорошо.

Я сделал некоторую отладку, и из чегоЯ понял, что и модель, и модель по умолчанию всегда верны: DDC просто не показывает их, и я не могу понять, почему.Дайте мне знать, если потребуется дополнительная информация.

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Вы используете DropDownChoice без предоставления IChoiceRenderer, поэтому Wicket использует new ChoiceRenderer(), т.е. без параметров displayExpression и idExpression.

Попробуйте с new DropDownChoice(id, model, list, new ChoiceRenderer("name", "id")), где "name" будет displayExpression и "id" idExpression для Sede и Sala.

0 голосов
/ 15 марта 2019

После еще нескольких копаний я обнаружил две разные ссылки на ошибку, которая предположительно была устранена в предыдущей версии.Я не говорю, что ошибка все еще существует, возможно, я все еще что-то пропустил, но обходной путь для этой ошибки работал и в моем случае.

Кажется, что была некоторая проблема с классом, используемым в качестве модели: еслион не реализовал equals () и hashcode (), его экземпляры не будут корректно сравниваться друг с другом ChoiceRenderer в фоновом режиме.Итак, я добавил hashcode () и equals () в классы Sede и Sala, просто в отчаянии, и все заработало.

Ссылки на ссылки:

РЕДАКТИРОВАТЬ: предложение martin_g также работало нормально, поэтому я отметил его как правильный ответ.Я просто оставлю свое предыдущее решение как предложение.

...