2013-03-26 11 views
5

Ci sono diverse domande correlate su questo argomento su SO e elsewhere, ma non sono riuscito a trovare una risposta definitiva su questa domanda specifica.apre una nuova pagina (vai al nuovo sito) quando selezioni una riga di dataTable

Ho un p:dataTable e voglio la possibilità di fare clic su una riga e aprire una pagina di dettaglio (una nuova pagina, non un dialogo o una finestra).

ho risolto in questo modo (che ho dal sito web primefaces, per qualche motivo non c'è più: http://web.archive.org/web/20101001223235/http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf):

<p:dataTable var="order" value="#{orderBean.orders}" selection="#{orderBean.selectedOrder}" selectionMode="single" rowKey="#{order.number}"> 
    <p:ajax event="rowSelect" listener="#{orderBean.orderSelect}"/> 
    <p:column ... /> 
</p:dataTable> 

La navigazione viene quindi eseguita nel chicco:

public void orderSelect(SelectEvent event) { 
    ConfigurableNavigationHandler nh = (ConfigurableNavigationHandler)FacesContext.getCurrentInstance().getApplication().getNavigationHandler(); 
    nh.performNavigation("orderDetail?faces-redirect=true"); 
} 

La mia domanda: c'è un modo per farlo solo all'interno di JSF senza l'aiuto di un backing bean?

Sto anche chiedendo perché hanno rimosso il codice exmaple dal sito primefaces, che potrebbe essere un'indicazione che questo non è il modo giusto di fare qualcosa del genere.

risposta

1

Come non ho trovato una soluzione davvero perfetta, questo è come lo faccio ora.

che ho ora una classe di "navigatore" come questo

@Component 
public class Navigator { 
    public void nav(String page) { 
    UIHelper.navigateTo(page); 
    } 
} 

E io chiamo questa classe dal mio evento Ajax:

<p:ajax event="rowSelect" listener="#{navigator.nav('orderDetail')}"/> 

Come ho già detto, non proprio perfetto, ma mi piace il fatto che non devo scrivere codice nel mio backing bean. (Naturalmente devo scrivere il codice per il Navigatore, ma posso riutilizzarlo.)

1

poiché è una richiesta Ajax, in genere la richiesta/risposta viene utilizzata per re-rendering di alcuni componenti nella pagina Web. Quello che potresti fare è

<p:ajax event="someventofintrest" onsuccess="javascript:myjsmethod();"></p:ajax> 

and 

<p:remotecommand name="myjsmethod" action="#{mybean.mybeanmethod}" /> 

and in the backing bean 

public String mybeanmethod(){ 
    return "mynewpage"; // Navigate away to mynewpage.xhtml 
} 

HTH.

+0

true - ma non è molto meno codice. Stavo pensando a qualcosa come '

+0

Sì, ma le richieste Ajax non sono realmente lì per navigare lontano dalla pagina corrente. Solo i metodi di azione dai comandi di comando (pulsanti di comando, collegamenti di comando, comando remoto, ecc.) Fanno la funzione di navigazione. Vedi questo link: http://stackoverflow.com/questions/5406855/jsf-navigation-with-ajax – maggu

+0

Hai ragione. Sembra che sto cercando una soluzione senza usare ajax - ma immagino che non funzionerà quando sto usando 'p: datatable'. –

8

Avvolgere la cella (s) di interesse in un semplice <h:link>.

<p:column> 
    <h:link outcome="orderDetail"> 
     ... 
    </h:link> 
</p:column> 

Usa se necessario CSS display:block sul link per lasciare che abbracciano l'intera cella. Se necessario, è possibile passare i parametri di richiesta utilizzando uno nidificato <f:param>.

+1

Bello, funziona. Ma dato che devo avvolgere il '' s intorno a ogni cella (colonna), non è ancora la migliore soluzione a una linea che stavo cercando. Forse sono solo troppo particolare! (A proposito, grazie per il suggerimento 'display: block'.) –

+1

Giusto, ma è meglio che tu lo possa ottenere se vuoi mantenerlo SEO friendly. – BalusC

+0

SEO - non ci ho pensato prima. Con piacere la mia applicazione è solo interna.Credo di aver trovato un modo per farlo che si adatta alle mie esigenze e non richiede troppa codifica nei backing bean. –

Problemi correlati