2012-04-04 12 views
11

मेरे पास प्राइमफ़ेस में एक डेटाटेबल है और मैं चाहता हूं कि जब मैं इसमें कोई पंक्ति जोड़ूं, तो डेटाटेबल के अंतिम पृष्ठ को देखें।प्राइमफ़ेस: डेटाटेबल पर सेट पेज

मेरे .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> 

सेम:

@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; 
    } 

} 

लेकिन js समारोह setTabIndexTT() onSuccess ajax द्वारा कभी नहीं कहा जाता है ...

मैं कैसे कर सकते हैं पंक्ति जोड़ते समय मेरे डेटाटेबल के अंतिम पृष्ठ को सेट करें?

प्राइमफ़ेस संस्करण 3.1.1

उत्तर

11

अपने प्रबंधित सेम में आप इस कोड की कोशिश कर सकते बाइंडिंग का उपयोग कर अपने कोड में स्पष्ट आईडी से बच सकते हैं:

एक्सएचटीएमएल:

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

सेम:

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); 
} 
} 
+1

+1 'd.setFirst (पहले) के लिए कुछ जोड़ना होगा; '। मेरे मामले में, मैंने उपयोग किया है: '((डेटाटेबल) FacesContext.getCurrentInstance()। GetViewRoot()। FindComponent (" myForm ")। ढूंढें कॉम्पोनेंट (" myDataTable "))।सेट फर्स्ट (0) 'हर बार जब मैं सामग्री को रीफ्रेश करता हूं तो पहले पृष्ठ पर जाने के लिए। – falsarella

+0

क्या मुझे पता चलेगा कि 'ROWS_DATATABLE' क्या इंगित करता है ?? उलझन में –

+0

मुझे लगता है कि प्राइमफेस के बाध्यकारी-विशेषता का उपयोग करना-डेटाटेबल कोड को अधिक साफ (कोई हार्डकोडेड आईडी) नहीं बनाता है –

1

मैं इसे बिना किसी जावास्क्रिप्ट के कर दूंगा। प्राइमफेस के डेटाटेबल में first विशेषता है, जो प्रदर्शित करने वाले पहले डेटा का सूचकांक है।

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

और अपने समर्थन की फलियों: जब आप एक नई पंक्ति

+0

लेकिन getFirst() जब शुरू होता है? केवल पहली बार डेटाटेबल प्रस्तुत किया जाता है? अगर मैं पेजिनेटर के साथ पेज बदलता हूं, तो पहले से प्राप्त करें() को आक्रमण नहीं किया जाता है ... – 3vi

+0

आप सही हैं, मैंने इसकी निगरानी की है। यह समाधान केवल तभी काम करता है जब आपका बैकिंग बीन सत्र स्कॉप्ड होता है (जो आपके नमूने में मामला है) और 'addRow' एक्शन एक नया दृश्य बनाता है। आप 'addRow' को शून्य के रूप में परिभाषित करने के बजाय वर्तमान दृश्य आईडी को वापस कर कर ऐसा कर सकते हैं। – fischermatte

+0

क्षमा करें, लेकिन मैं यह नहीं समझता कि मैं एक नया दृश्य कैसे बना सकता हूं ... – 3vi

0

आप जोड़ने

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); 
} 

कॉल इस विधि:

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(){ 
     ... 
    } 
} 
+2

बाइंडिंग आपको और भी अधिक समस्याएं बनाती हैं, ज्यादातर सीरियलाइजेशन मुद्दे: http://stackoverflow.com/questions/8392236/jsf-uicomponent-binding-serializable-and-view-scoped –

4

अगर datatable widgetVar dataTableWidget तो इस का उपयोग किया जाता है:

<script type="text/javascript"> 
      $(document).ready(function() { 
       dataTableWidget.paginator.setPage(0); 
      }); 
</script> 
संबंधित मुद्दे