#ajax #wicket
#ajax #калитка
Вопрос:
Когда на экране есть несколько взаимодействующих элементов управления Ajax, и вы хотите управлять видимостью компонентов для реагирования на эти элементы управления (чтобы отображать только то, что имеет смысл в любой конкретной ситуации), вызов target.addComponent()
вручную всего, что вы хотите обновить, становится громоздким и не очень удобным в обслуживании.
В конечном итоге web of onClick
и onUpdate
обратные вызовы могут достичь точки, когда добавление нового компонента на экран становится намного сложнее, чем это должно быть.
Каковы обычно используемые стратегии (или даже библиотеки, если такая вещь существует), чтобы избежать этого наращивания сложности?
Обновление: Спасибо за ваши ответы, я нашел их все очень полезными, но я могу принять только один. Извините.
Ответ №1:
В Wicket 1.5 есть шина событий. У каждого компонента есть метод onEvent (полезная нагрузка объекта). С помощью component.send() вы можете транслировать события, и каждый компонент может проверять полезную нагрузку (например, объект UserJoinedEvent) и решать, хочет ли он участвовать в текущем ответе Ajax. Смотрите http://www.wicket-library.com/wicket-examples/events для простой демонстрации.
Комментарии:
1. Это звучит действительно многообещающе.
Ответ №2:
Вы могли бы добавить структурные компоненты, такие как WebMarkupContainer
s, когда вы добавите это в AjaxTarget, все, что в нем содержится, также будет обновлено. Это позволяет обновлять группы компонентов в одной строке.
Ответ №3:
Когда я создаю компоненты для страницы, я обычно добавляю их в массивы компонентов:
Component[] pageComponents = {
new TextField<String>("Field1"),
new TextField<String>("Field2"),
new TextField<String>("Field3")
}
Начиная с версии Wicket 1.5, функции добавления принимают параметры массива [1]. Поэтому элементы могут быть добавлены на страницу или целевой объект следующим образом:
add(pageComponents);
target.add(pageComponents);
Затем компоненты могут быть сгруппированы на основе того, что вы хотите обновить вместе.
Ответ №4:
Ну, о скольких компонентах мы здесь говорим? Десять? Двадцать? Сотни?
Для двадцати или около того у вас может быть контроллер состояния, который управляет тем, какие компоненты должны отображаться. Этот контроллер задает видимое поле модели компонентов, и вы всегда добавляете все компоненты в свои запросы, которые обрабатываются контроллером. События ajax компонентов вы просто перенаправляете в метод обработки контроллера.
Для действительно большого количества компонентов, которые имеют слишком большую полезную нагрузку для хорошей производительности, вы могли бы использовать библиотеки javascript, такие как jQuery, чтобы показывать и скрывать что-либо клиентом.
Комментарии:
1. Я не думаю, что у вас действительно должно быть намного больше двадцати элементов на одном экране в любом случае, так что это максимум, на который я ориентируюсь здесь.
Ответ №5:
В настоящее время я использую какой-то модифицированный шаблон наблюдателя для имитации шины событий в Wicket 1.4.
Мои страницы действуют как наблюдаемый наблюдатель, поскольку мои компоненты не знают друг друга и повторно используются в разных комбинациях на нескольких страницах. Всякий раз, когда один компонент получает Ajax-событие, которое также может повлиять на другие компоненты, он вызывает метод на своей странице с объектом-событием и ajax-целью. Страница вызывает аналогичный метод для всех компонентов, которые зарегистрировались для такого рода событий, и каждый компонент может решить на основе предоставленного объекта-события, должен ли он реагировать и как он может подключиться к цели.
То же самое можно заархивировать с помощью посетителя калитки. Я не знаю, какой из них лучше, но я думаю, что это в основном вопрос вкуса.