Domanda

L'applicazione web che sto sviluppando con MyFaces 2.0.3 / primefaces 2.2RC2 è diviso in un contenuto e una zona di navigazione. Nell'area di navigazione, che è incluso in più pagine utilizzando template (cioè <ui:define>), ci sono alcuni widget (per esempio un albero di navigazione, pannelli pieghevoli, ecc), di cui voglio preservare lo stato dei componenti attraverso punti di vista.

Per esempio, diciamo che io sono sulla home page. Se navigando a una pagina di dettagli del prodotto cliccando su un prodotto nella struttura di navigazione, i miei Java trigger di codice un redirect utilizzando

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

Un altro modo di arrivare a quella pagina dettagli sarebbe cliccando direttamente su un teaser del prodotto che viene visualizzato sulla home page. Il <h:link> corrispondente ci porterebbe alla pagina dei dettagli.

In entrambi i casi, lo stato di espansione del mio albero di navigazione (un componente primefaces albero) e le mie pannelli riducibili è perduto. Capisco che questo è perché i risultati di reindirizzamento / h:link nella creazione di una nuova visualizzazione.

Qual è il modo migliore di trattare con questo? Sono già usando MyFaces Orchestra nel mio progetto insieme alla sua portata conversazione, ma non sono sicuro se questo è di alcun aiuto qui (in quanto avrei dovuto legare l'espansione / collasso stato dei widget per un backing bean ... ma per quanto ne so, questo non è possibile). C'è un modo di dire JSF, che gli stati componenti di propagare alla visualizzazione successiva, partendo dal presupposto che lo stesso componente esiste in questo punto di vista?

Credo che avrei potuto bisogno di un puntatore nella direzione giusta qui. Grazie!


Aggiornamento 1: Ho appena provato vincolanti i pannelli e l'albero per un session bean con ambito, ma questo sembra non avere alcun effetto. Inoltre, credo che avrei dovuto legare tutti i componenti figlio (se presente) manualmente, quindi questo non sembra come la strada da percorrere.

Aggiornamento 2: Rilegatura componenti dell'interfaccia utente a non richiesta ambito fagioli non è una buona idea (vedi link che ho postato in un commento qui sotto). Se non esiste un approccio più semplice, avrei potuto procedere nel seguente modo:

  • Quando un pannello è compresso o l'albero è espansa, salvare lo stato corrente in un backing bean di sessione con ambito (! = La componente di interfaccia utente stesso)
  • stati dei componenti sono memorizzati in una mappa. La chiave mappa è del componente (si spera) unico, relativo ID. Non è possibile utilizzare l'intero percorso componente assoluto qui, poiché gli ID dei contenitori controllante denominazione potrebbe cambiare se la vista cambia, assumendo questi ID vengono generati programmazione.
  • Non appena una nuova visualizzazione viene costruito, recuperare gli stati dei componenti dalla mappa e applicarle ai componenti. Ad esempio, nel caso dei pannelli, è possibile impostare l'attributo collapsed ad un valore recuperato dal mio backing bean di sessione con ambito.

Aggiornamento 3: ho ottenuto lavorando come descritto sopra. Per riassumere, la soluzione è quella di memorizzare le proprietà rilevanti in un session bean con ambito invece di fare l'intera sessione di UIComponent-ambito. Poi, quando il componente è ri-costruito dopo il termine della navigazione, impostare i valori di attributo recuperando le proprietà salvate (utilizzando EL), per esempio.

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

(Questo è un esempio semplificato. Poiché sono utilizzando più pannelli, sto usando una mappa per memorizzare queste proprietà, come descritto sopra).

È stato utile?

Soluzione

Una soluzione potrebbe essere quella di utilizzare i bean di sessione con ambito.

Altri suggerimenti

Che cosa si intende per pannelli riducibili? Lo chiedo perché c'è una componente che è richiudibile così come un componente. Sto usando nel pannello di navigazione nel mio progetto. L'accordianPanel ha un attributo denominato "activeIndex". Ecco quello che ho fatto nella mia SessionBean per mantenere lo stato delle mie schede di fisarmonica:

 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>

Non sto utilizzando il componente albero per la navigazione come quello presentato il mio progetto con alcune difficoltà che sono stati facilmente superati utilizzando l'accordionPanel, quindi non posso parlare a quella parte della vostra navigazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top