Как получить все объекты модели из таблицы данных калитки - PullRequest
1 голос
/ 10 ноября 2011

Я использую калитку DefaultDataTable. Он содержит некоторые текстовые поля, в которые пользователь должен вводить значения. Таблица находится в форме. Когда я отправляю форму, я хочу заполучить все «строки», чтобы я мог их перебирать. Я не хочу использовать AJAX.

Мне удалось связать таблицу с объектом «Контакт», с EditablePropertyColumn, который показывает нужные поля и поля ввода в нужных мне столбцах.

Как я могу получить элементы строки? dataTable.getDefaultModelObject() возвращает null при отправке формы.

Ответы [ 4 ]

3 голосов
/ 12 ноября 2011

Честно говоря, звучит так, будто у вас есть что-то другое (более фундаментальное) неправильно. Как отмечает martin-g, в столбце редактируемых свойств используется модель свойств, что означает, что при отправке формы (если все проверки и т. Д. Пройдены) она вызовет setObject для этой модели, которая, в свою очередь, вызовет setFoo (где " foo "является свойством для этого столбца) в POJO, который поддерживает эту строку данных в вашей таблице.

Вы можете (как упоминает Дон) использовать посетителя для перебора дочерних элементов вашей таблицы. Однако в целом это означает, что вы делаете что-то еще не так. Wicket написан так, что вам не нужно извлекать данные из отправленной формы и помещать их самостоятельно в ваши POJO. Модель должна сделать это для вас. Вы не должны «толкать» данные вокруг себя.

Отображение некоторого кода может помочь, но если не считать этого: откуда ваша таблица получает данные (некоторый список контактов и т. Д.) - попробуйте просто извлечь данные из тех же объектов. Это уже должно быть заполнено для вас. Если это не так, опубликуйте некоторый код - особенно там, где вы инициализируете таблицу и ее поставщика данных.

2 голосов
/ 10 ноября 2011

Отправленные данные заполняются в объекте Contact. Вот как работает PropertyColumn.

1 голос
/ 11 ноября 2011

DefaultDataTable имеет метод newRowItem, в этом методе вы можете поймать модели, отображаемые в таблице:

  private List<IModel<T>> models= new LinkedList<IModel<T>>();
    @Override
    protected Item<T> newRowItem(final String id, int index,
            final IModel<T> model) {
              models.add(model);
    }
0 голосов
/ 11 ноября 2011

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

Один из способов - просто поддерживать список ссылок на моделигде-то за пределами DefaultDataTable, как вы его строите.

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

Класс WebMarkupContainer имеет метод

public final <S extends Component> Object visitChildren(final Class<?> clazz,
    final IVisitor<S> visitor)

, который можно использовать для обхода всех содержащихся в нем компонентов конкретного класса, и метод

public final Object visitChildren(final IVisitor<Component> visitor)

, который делает то же самое, но не ограничивается определенным классом.

Интерфейс IVisitor<T extends Component> требует, чтобы вы определили метод

public Object component(T component)

, который вызывается этим "посещением"msgstr "методы с каждым компонентом найдены в качестве аргумента.Возвращаемое значение является сигналом для продолжения или выхода из обхода, и метод, который вы определяете, может собирать вещи, найденные в компоненте, в список.

...