2012-04-04 17 views
11

Ho un datatable in primefaces e voglio, quando aggiungo una riga in esso, visualizzare l'ultima pagina del datatable.Primefaces: set page su datatable

La mia pagina .xhtml è:

<h:form id=...> 
... 
<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1"/> 
... 
</h:form> 

<h:form id=...> 
... 
<p:inputText id="txt_description" value="#{templateController.templateDescription}" label="templateDescription"> 
       <f:validateLength for="txt_name" minimum="1"/> 
       <p:ajax event="change" 
        listener="#{calculatePageTable.setPageTableTemplate}" onsuccess="setTabIndexTT()"/> 
       </p:inputText> 
... 
</h:form> 
<script type="text/javascript"> 
     function setTabIndexTT(){ 
        tbl1.getPaginator().setPage(#{calculatePageTable.pageTableTemplate}); 
       } 
     </script> 

di fagioli:

@ManagedBean 
@SessionScoped 
public class CalculatePageTable { 

    private int pageTableTemplate = 0; 
    private int pageTableField = 0; 

    public void setPageTableTemplate() { 

     final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot() 
      .findComponent("form:templateTable"); 
     pageTableTemplate = d.getPageCount() - 1; 

    } 

    public int getPageTableTemplate() { 
     return pageTableTemplate; 
    } 

    public void setPageTemplateField() { 

     final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot() 
      .findComponent("detailsTable:webTemplateUpdateTable"); 
     pageTableField = (d.getPageCount() - 1); 
    } 

    public int getPageTableField() { 
     return pageTableField; 
    } 

} 

Ma la funzione di setTabIndexTT js() non viene mai chiamato da ajax onSuccess ...

Come posso imposta l'ultima pagina del mio datatable quando aggiungi una riga?

versione

primefaces è 3.1.1

risposta

11

Nella tua bean gestito si può provare questo codice:

public void setPageDataTable() { 
    final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot() 
     .findComponent("form:templateTable"); 
    int first = 1; 
    if (d.getRowCount() % ROWS_DATATABLE == 0) { 
     first = (d.getRowCount() - ROWS_DATATABLE); 
    } 
    else 
    { 
     first = (d.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE; 
    } 
    d.setFirst(first); 
} 

chiamare questo metodo quando si aggiunge una nuova riga

+1

+1 per il d.setFirst (prima) ',' p ajax onsucces =' widgetVar.getPaginator() setPage (pageIndex).>'. Nel mio caso, ho usato: '((DataTable) FacesContext.getCurrentInstance() getViewRoot() findComponent ("MyForm") findComponent ("myDataTable")...).setFirst (0) 'per andare alla prima pagina ogni volta che aggiorno il contenuto. – falsarella

+0

Posso sapere cosa è 'ROWS_DATATABLE' che indica qui ?? confuso –

+0

Suppongo che l'uso dell'attributo-binding dei dati primari-datatable renda il codice sopra più pulito (senza ID hardcoded) –

1

lo farei senza JavaScript. Il datatable di Primefaces ha un attributo first, che è l'indice dei primi dati da visualizzare.

<p:dataTable first="#{calculatePageTable.first}"/> 
... 
<p:commandButton value="Add a row" action="#{calculatePageTable.addRow}"/> 

E il vostro supporto di fagioli:

public class CalculatePageTable { 
    private int first = 1; 

    public int getFirst(){ 
     return first; 
    } 

    public void addRow(){ 
     // 1. your stuff for adding the row 
     ... 
     // 2. switch to the row 
     first = getFirstRowOnLastPage(); 
    } 

    private int getFirstRowOnLastPage(){ 
     ... 
    } 
} 
+0

ma getFirst() quando viene richiamato? Solo la prima volta il datatable è renderizzato? Se cambio pagina con paginator, afet getFirst() non viene invocato ... – 3vi

+0

Hai ragione, l'ho supervisionato. questa soluzione funziona solo quando il tuo backing bean è a scope di sessione (come nel tuo esempio) e l'azione 'addRow' crea una nuova vista. Puoi farlo restituendo il viewId corrente invece di definire 'addRow' come nullo. – fischermatte

+0

Mi spiace, ma non capisco come posso creare una nuova vista ... – 3vi

0

È potrebbe evitare l'ID esplicito nel codice utilizzando le associazioni:

xhtml:

<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1" binding="#{calculatePageTable.dataTable" /> 

di fagioli:

public class CalculatePageTable { 
private DataTable dataTable; 

public DataTable getDataTable() { 
    return dataTable; 
} 

public void setDataTable(DataTable dataTable) { 
    this.dataTable = dataTable; 
} 

/* See Teg's answer */ 
public void setPageDataTable() { 
    int first = 1; 
    if (dataTable.getRowCount() % ROWS_DATATABLE == 0) { 
     first = (dataTable.getRowCount() - ROWS_DATATABLE); 
    } 
    else 
    { 
     first = (dataTable.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE; 
    } 
    dataTable.setFirst(first); 
} 
} 
+2

I binding ti fanno ancora più problemi, principalmente problemi di serializzazione: http://stackoverflow.com/questions/8392236/jsf-uicomponent-binding-serializable-and-view-scoped –

4

se il widgetVar DataTable è dataTableWidget quindi utilizzare questo:

<script type="text/javascript"> 
      $(document).ready(function() { 
       dataTableWidget.paginator.setPage(0); 
      }); 
</script> 
Problemi correlati