Frage

Die Web-Anwendung Ich entwickle MyFaces 2.0.3 / PrimeFaces mit 2.2RC2 ist unterteilt in einen Inhalt und einen Navigationsbereich. In dem Navigationsbereich, der in mehreren Seiten enthalten ist, unter Verwendung von Templat (d.h. <ui:define>), gibt es einige widgets (beispielsweise eine Navigationsstruktur, zusammenklappbare Platten etc.), von denen die Komponente I Zustand über Aufrufe erhalten möge.

Zum Beispiel, sagen wir, ich auf der Startseite bin. Wenn ich zu einem Produktdetail Seite navigieren, indem Sie in der Navigationsstruktur auf ein Produkt klicken, meine Java-Code-Trigger eine Umleitung mit

navigationHandler.handleNavigation(context, null,
  "/detailspage.jsf?faces-redirect=true")

Eine andere Möglichkeit, auf diese Details Seite bekommen, indem Sie direkt einen Klick auf ein Produkt Teaser sein würde, die auf der Homepage angezeigt wird. Der entsprechende <h:link> würde uns auf die Detailseite führen.

In beiden Fällen ist die Expansion Zustand meines Navigationsbaums (a PrimeFaces Baumkomponente) und meine zusammenklappbaren Platten verloren. Ich verstehe, ist dies, weil die Umleitung / h:link Ergebnisse bei der Schaffung einer neuen Ansicht.

Was ist der beste Weg, damit umzugehen? Ich bin schon mit MyFaces Orchestra in meinem Projekt zusammen mit seinem Gespräch Umfang, aber ich bin nicht sicher, ob dies eine Hilfe ist hier (da ich die Expansion binden müss / zusammengeklappten Zustand der Widgets auf einen Träger Bohne ... aber soweit ich weiß, ist dies nicht möglich). Gibt es eine Möglichkeit JSF zu sagen, welche Komponente Staaten zur nächsten Ansicht zu verbreiten, unter der Annahme, dass die gleiche Komponente in dieser Ansicht vorhanden ist?

Ich glaube, ich hier einen Zeiger in die richtige Richtung braucht. Dank!


Update 1: Ich Bindung gerade versucht, die Platten und den Baum zu einer Session-scoped Bohne, aber dies scheint keine Wirkung zu haben. Auch ich denke, ich würde alle untergeordneten Komponenten binden (falls vorhanden) manuell, so dass dies nicht die Art, wie scheint zu gehen.

Update 2: Die Bindung UI-Komponenten auf nicht-Anfrage Bohnen scoped ist keine gute Idee (siehe Link ich in einem Kommentar geschrieben unten). Wenn es kein einfacher Ansatz ist, könnte ich muss gehen Sie wie folgt vor:

  • Wenn eine Platte zusammengedrückt wird oder der Baum erweitert wird, speichert den aktuellen Zustand in einem Session-scoped Backing Bean (! = Die UI-Komponente selbst)
  • Die Komponenten Zustände sind in einer Karte gespeichert. Die Kartenschlüssel der Komponente (hoffentlich) einzigartig, relativ ID. Ich kann nicht den ganzen absoluten Komponentenpfad hier verwenden, da die IDs der Elternnamen Container könnte, wenn du die Ansicht ändert ändern, diese IDs unter der Annahme erzeugt programmatisch.
  • Sobald eine neue Ansicht aufgebaut wird, abrufen, die die Zustände der Komponenten aus der Karte und sie auf die Komponenten. Zum Beispiel bei den Platten, kann ich das collapsed Attribut auf einen Wert von meiner Session-scoped Backing Bean abgerufen eingestellt.

Update 3: Ich habe es funktioniert, wie oben beschrieben. Um es zusammenzufassen, ist die Lösung der relevanten Eigenschaften in einer Session-scoped Bohne zu speichern, anstatt die gesamte UIComponent macht session-scoped. Dann, wenn das Bauteil wieder aufgebaut, nachdem die Navigation aufgetreten ist, festgelegt durch die Attributwerte, die gespeicherten Eigenschaften Abrufen (unter Verwendung von EL), z.

<p:panel collapsed="#{backingBean.collapsedState}" ... />

(Dies ist ein vereinfachtes Beispiel. Da ich mehrere Panels verwenden, ich eine Karte verwende diese Eigenschaften zu speichern, wie oben beschrieben).

War es hilfreich?

Lösung

Eine Lösung für den Einsatz session-scoped Bohnen sein würde.

Andere Tipps

Was meinst du mit zusammenklappbaren Platten? Ich frage, weil es eine Komponente, die auch als eine Komponente verschließbar ist. Ich verwende in meinem Projekt im Navigationsbereich. Die accordianPanel hat ein Attribut namens „activeIndex“. Hier ist, was ich in meinem SessionBean tat den Zustand meines Akkordeon Tabs zu halten:

 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>

Ich bin mit der Baum-Komponente nicht für die Navigation wie mein Projekt mit einigen Schwierigkeiten bereitet, die sie leicht mit Hilfe der accordionPanel überwunden, so dass ich nicht auf den Teil Ihres Navigations sprechen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top