Веб-приложение, которое я разрабатываю с использованием MyFaces 2.0.3 / PrimeFaces 2.2RC2, разделено на контент и область навигации.В области навигации, которая входит в состав нескольких страниц с использованием шаблонов (т. Е. <ui:define>
), есть некоторые виджеты (например, дерево навигации, складные панели и т. Д.), Из которых я хочу сохранить состояние компонента в представлениях.
Например, допустим, я на главной странице.Когда я перехожу на страницу сведений о продукте, щелкая продукт в дереве навигации, мой код Java запускает перенаправление, используя
navigationHandler.handleNavigation(context, null,
"/detailspage.jsf?faces-redirect=true")
. Другим способом перехода на эту страницу сведений является прямой щелчок по продукту.тизер, который показан на главной странице.Соответствующий <h:link>
приведет нас к странице сведений.
В обоих случаях состояние расширения моего навигационного дерева (компонент дерева PrimeFaces) и моих складных панелей теряется.Я понимаю, что это потому, что перенаправление / h:link
приводит к созданию нового представления.
Как лучше всего справиться с этим?Я уже использую MyFaces Orchestra в своем проекте вместе с областью его диалога, но я не уверен, поможет ли это здесь (так как мне пришлось бы привязывать состояние раскрытия / свертывания виджетов к компоненту поддержки).но насколько я знаю, это невозможно).Есть ли способ сообщить JSF, какие состояния компонентов распространяются на следующее представление, предполагая, что в этом представлении существует тот же компонент?
Полагаю, мне может понадобиться указатель в правильном направлении.Спасибо!
Обновление 1: Я только что попытался привязать панели и дерево к сессионному компоненту, но это, похоже, не дает никакого эффекта.Кроме того, я предполагаю, что мне придется привязывать все дочерние компоненты (если таковые имеются) вручную, так что это не похоже на путь.
Обновление 2: Связывание компонентов пользовательского интерфейса с не-request scoped beans не очень хорошая идея (см. ссылку, которую я разместил в комментарии ниже).Если нет более легкого подхода, мне, возможно, придется действовать следующим образом:
- Когда панель свернута или дерево развернуто, сохраните текущее состояние в компоненте поддержки области сеанса (! =Сам компонент UI)
- Состояния компонентов хранятся на карте.Ключ карты - это, как мы надеемся, уникальный относительный идентификатор компонента.Я не могу использовать здесь полный абсолютный путь к компоненту, поскольку идентификаторы родительских контейнеров имен могут измениться при изменении представления, если предположить, что эти идентификаторы генерируются программно.
- Как только создается новое представление, извлекайте компоненты'состояния с карты и применить их к компонентам.Например, в случае панелей я могу установить для атрибута
collapsed
значение, извлеченное из моего базового компонента в области сеанса.
Обновление 3: Я получил егоработает как описано выше.Чтобы подвести итог, решение состоит в том, чтобы сохранить соответствующие свойства в bean-объекте области сеанса вместо того, чтобы делать всю UIComponent-область действия сеанса.Затем, когда компонент будет перестроен после навигации, установите значения атрибута путем извлечения сохраненных свойств (используя EL), например,
<p:panel collapsed="#{backingBean.collapsedState}" ... />
(Это упрощенный пример. Так как я использую несколькоПанели, я использую карту для хранения этих свойств, как описано выше).