четверг, 15 апреля 2010 г.

Wicket Работа с динамическими списками элементов

Теперь, когда я рассказал про общую концепцию, установку и валидацию в Wicket, перейдем к работе с его компонентами.


Задача. Необходимо отображать данные, количество которых меняется, то есть неизвестно заранее сколько их будет. Это может быть таблица товаров, перечень допустимых действий над объектом или что-то еще. Все это объединяет тот факт, что мы не знаем в момент написания шаблона, сколько табличных или списочных элементов нам понадобится.


Для этих целей используется компонент RepeatingView, он не отображается сам при отрисовке страницы. Его основное назначение - быть контейнером для динамических данных.


Сразу перейдем к примеру и его объяснению. Я буду отображать на странице некие статические данные (понятно, что здесь может быть вызов сервиса, предоставляющего данные из базы). Шаблон страницы (Example.html) выглядит так:



Шаблон довольно простой. Стоит заметить, что для всех элементов, содержащихся в interestLinksList будут повторяться только внутренние элементы. То есть span повторяться не будет.


Рассмотрим класс страницы.

Теперь разберем этот код более подробно. Класс ListItem вспомогательный. Он создан лишь для удобства работы со списками. Статическая константа LIST необходима тоже лишь для демонстрации, поскольку в обычном приложении будет использоваться поставщик данных из сервис слоя. Более интересно наличие промежуточного компонента WebMarkupContainer. Этот компонент необходим для того, чтобы Wicket мог отличить различные элементы динамического списка. Для этого разработчик создает этот промежуточный компонент и устанавливает ему id с помощью вызова

Замечу, что в Tapestry 5, этот процесс автоматизирован и скрыт от глаз разработчика, что, по моему мнению, является правильным шагом. Здесь же нужно это делать самому. Таким образом после выполнения программы мы получим страницу, содержащую html примерно такого вида:

Уникальные id я опустил. Главное, что нет никаких вспомогательных тегов и повторяющийся контент содержится внутри основного тега контейнера. RepeatingView точно также можно использовать и с повторяющимися элементами формы. Я покажу это в статьях, посвященных различной работе с формами.

2 комментария:

  1. Очень актуальная тема. Думаю, эта серия статей будет очень полезной. Продолжайте, пожалуйста, раскрывать возможности Wicket. (Очень интересно было бы увидеть редактирование нескольких сущностей на форме, например)

    ОтветитьУдалить
  2. Спасибо за отклик, Олег. Статьи будут продолжаться. Тем довольно много, главное, что они будут публиковаться на регулярной основе три раза в неделю: понедельник, среда и пятница.

    ОтветитьУдалить