Question

L'application web que je développe en utilisant MyFaces 2.0.3 / PrimeFaces 2.2RC2 est divisé en un contenu et une zone de navigation. Dans la zone de navigation, qui est inclus dans plusieurs pages à l'aide templating (à savoir <ui:define>), il y a quelques widgets (par exemple un arbre de navigation, panneaux réductibles etc.) dont je veux préserver l'état du composant dans des vues.

Par exemple, disons que je suis sur la page d'accueil. Lorsque je navigue sur une page Détails du produit en cliquant sur un produit dans l'arbre de navigation, mon code Java déclenche une redirection en utilisant

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

Une autre façon de se rendre à la page qui détaille serait en cliquant directement sur un teaser de produit qui est affiché sur la page d'accueil. Le <h:link> correspondant nous conduirait à la page de détails.

Dans les deux cas, l'état d'extension de mon arbre de navigation (un composant arbre PrimeFaces) et mes panneaux réductibles est perdu. Je comprends cela est parce que les résultats redirect / de h:link dans la création d'une nouvelle vue.

Quelle est la meilleure façon de faire face à cela? Je suis déjà en utilisant Orchestra MyFaces dans mon projet ainsi que son champ de conversation, mais je ne sais pas si cela est de toute aide ici (car je dois lier l'expansion / effondrées état des widgets à un backing bean ... mais pour autant que je sache, ce n'est pas possible). Est-il possible de dire JSF que les États composant de se propager à la vue suivante, en supposant que le même composant existe dans ce point de vue?

Je suppose que je pourrais avoir besoin d'un pointeur dans la bonne direction ici. Merci!


Mise à jour 1: Je viens d'essayer lier les panneaux et l'arbre à un haricot scope session, mais cela semble avoir aucun effet. De plus, je suppose que je dois relier tous les composants de l'enfant (le cas échéant), de sorte que cela ne semble pas manuellement comme le chemin à parcourir.

Mise à jour 2: Binding interface utilisateur pour les haricots scope non demande n'est pas une bonne idée (voir le lien I a écrit dans un commentaire ci-dessous). S'il n'y a pas d'approche plus facile, je pourrais avoir à procéder comme suit:

  • Lorsqu'un panneau est réduit ou l'arbre est étendu, sauf l'état actuel dans un bean scope session de support (! = Le composant d'interface utilisateur lui-même)
  • Les états des composants sont stockés dans une carte. La clé de la carte est du composant (espérons-le) ID unique, relatif. Je ne peux pas utiliser tout le chemin composant absolu ici, puisque les ID des conteneurs de nommage parent peut changer si la vue change, en supposant ces ID sont générés par programme.
  • Dès qu'une nouvelle vue se construit, récupérer à partir de la carte et de les appliquer les états des composants aux composants. Par exemple, dans le cas des panneaux, je peux définir l'attribut collapsed à une valeur récupérée de sauvegarde ma scope session haricots.

Mise à jour 3: Je l'ai travaillé comme décrit ci-dessus. Pour résumer, la solution est de stocker les propriétés pertinentes dans un bean scope session au lieu de faire toute la UIComponent session scope. Ensuite, lorsque le composant est reconstruit après navigation a eu lieu, de définir les valeurs d'attribut en récupérant les propriétés enregistrées (en utilisant EL), par exemple.

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

(Ceci est un exemple simplifié. Depuis que je suis en utilisant plusieurs panneaux, je me sers d'une carte pour stocker ces propriétés, comme décrit ci-dessus).

Était-ce utile?

La solution

Une solution serait d'utiliser des haricots scope séance.

Autres conseils

Que voulez-vous dire par des panneaux pliables? Je demande parce qu'il est un composant qui peut être fermée ainsi qu'un composant. J'utilise dans le volet de navigation dans mon projet. Le accordianPanel a un attribut nommé « activeIndex ». Voici ce que je l'ai fait dans mon SessionBean pour maintenir l'état de mes pattes d'accordéon:

 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>

Je ne suis pas en utilisant le composant de l'arbre pour la navigation que celui présenté mon projet avec quelques difficultés qui ont été facilement résolus en utilisant la accordionPanel, donc je ne peux pas parler à cette partie de votre navigation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top