Изменения значений компонентов формы калитки в ListView, затрагивающие все элементы - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть ListView, который я использую для добавления нескольких строк с элементами формы (ввод текста, выборки и т. Д.), Которые соответствуют свойству модели, представляющей собой список элементов.Когда форма загружается впервые, элементы инициализируются как новые экземпляры этого класса.Казалось, что Wicket не сможет их различить, если я не добавлю явно значения в свойство этого объекта.Он изменяет значение только тогда, когда я изменяю что-то в последней строке ListView, а когда это происходит, он меняет все из них, как если бы они были одним и тем же объектом.

Например:

Arrays.asList(new String(), new String(), new String()); 

против

Arrays.asList("a", "b", "c");

Калитка изменяет значения для отдельной строки только тогда, когда список, переданный в ListView, реализован вторым способом.

Вот упрощенный пример кода, который я использую:

WebMarkupContainer container = new WebMarkupContainer("container");
ListView<String> listView = new ListView<String>("propertyListView", model.getObjectsList()) {
                @Override
                protected void populateItem(final ListItem listItem) {
                    listItem.add(new TextField<String>("string", new PropertyModel<>(listItem.getModelObject(), "stringField")));
                }
            };
            listView.setReuseItems(true);
container.add(listView);
form.add(container);

Мой вопрос такой: есть ли какой-то интерфейс, который я могу реализовать, чтобы мне не приходилось использовать"обман" инициализации объектов с различными значениями свойств, и если да, то что / как?

1 Ответ

2 голосов
/ 26 сентября 2019

Вы разворачиваете модели, что не очень хорошо для Wicket'а и, вероятно, является причиной вашей проблемы.

Я бы переписал код примерно так:

  ListView<String> listView = new ListView<String>("meetingFiles", model) {
                @Override
                protected void populateItem(final ListItem<String> listItem) {
                    listItem.add(new TextField<String>("string", listItem.getModel()));
                }
            };
            listView.setReuseItems(true);
   container.add(listView);
   form.add(container);
...