JSF 2.0: сохранение состояния компонента в нескольких представлениях - PullRequest
1 голос
/ 05 января 2011

Веб-приложение, которое я разрабатываю с использованием 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}" ... />

(Это упрощенный пример. Так как я использую несколькоПанели, я использую карту для хранения этих свойств, как описано выше).

Ответы [ 2 ]

0 голосов
/ 06 января 2011

Что вы подразумеваете под складными панелями? Я спрашиваю, потому что есть компонент, который является закрываемым, а также компонент. Я использую в панели навигации в моем проекте. AccordianPanel имеет атрибут с именем «activeIndex». Вот что я сделал в своем sessionBean, чтобы поддерживать состояние моих аккордеонных вкладок:

 private int tabIndex; //declared a private variable

    public SessionBean() {
       tabIndex = 100; //set the initial tab index to 100 so all tabs are closed when page loads.
    }

    public int getTabIndex(){
       return tabIndex;
    }

    public void setTabIndex(int tabIndex){
       this.tabIndex=tabIndex;
    }

in my navigation pane:



<p:accordionPanel activeIndex="#{sessionBean.tabIndex}" collapsible="true" autoHeight="false">
    <p:tab title="#{tab1_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" /><br/>
    </p:tab>
    <p:tab title="#{tab2_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
    <p:tab title="#{tab3_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
 </p:accordionPanel>

Я не использую древовидный компонент для навигации, поскольку он представил мой проект с некоторыми трудностями, которые легко были преодолены с помощью accordionPanel, поэтому я не могу говорить с этой частью вашей навигации.

0 голосов
/ 05 января 2011

Одним из решений было бы использование сессионных компонентов.

...