【问题标题】:set page on p:datatable在 p:datatable 上设置页面
【发布时间】:2012-04-17 21:42:56
【问题描述】:

我在 primefaces 中有一个数据表,我想在其中添加一行时查看数据表的最后一页。

我的 .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;
   }

}

但是onsuccess ajax永远不会调用js函数setTabIndexTT()...

添加行时如何设置数据表的最后一页?

Primefaces 版本是 3.1.1

【问题讨论】:

    标签: primefaces jsf-2


    【解决方案1】:

    在您的托管 bean 中,您可以尝试以下代码:

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

    添加新行时调用此方法

    【讨论】:

    • +1 表示d.setFirst(first);。就我而言,我每次刷新内容时都使用:((DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("myForm").findComponent("myDataTable")).setFirst(0) 转到第一页。
    • 我可以知道这里的ROWS_DATATABLE 是什么意思吗??困惑
    • 我想使用 primefaces-datatable 的绑定属性会使上面的代码更干净(没有硬编码的 id)
    • 如何更改数据表页面?此代码仅将最后输入的行放在开头。
    【解决方案2】:

    如果数据表 widgetVar 是 dataTableWidget 然后使用这个:

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

    【讨论】:

    • 另见:stackoverflow.com/a/33413948/1599699PF('dataTableWV').paginator.setPage(PF('dataTableWV').paginator.cfg.pageCount - 1);RequestContext.getCurrentInstance().execute("PF('dataTableWV').paginator.setPage(PF('dataTableWV').paginator.cfg.pageCount - 1);");
    【解决方案3】:

    我会在没有任何 JavaScript 的情况下做到这一点。 Primefaces 的数据表有一个first 属性,它是要显示的第一个数据的索引。

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

    还有你的支持bean:

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

    【讨论】:

    • 但 getFirst() 何时被调用?只有第一次渲染数据表?如果我使用分页器更改页面,则不会调用 afet getFirst() ...
    • 你说得对,我已经监督过了。此解决方案仅在您的支持 bean 是会话范围(在您的示例中就是这种情况)并且 addRow 操作创建一个新视图时才有效。您可以通过返回当前 viewId 而不是将 addRow 定义为 void 来做到这一点。
    • 只需在最后的 addRow 操作中写入 ‘return "myView";’。其中 'myView' 是表格所在的 xhtml 页面的名称。这将指示 jsf 创建一个新视图而不是使用当前视图。
    • 您的解决方案工作正常,但目前不适用于我。我有一个范围为支持 bean 的视图,它具有用于数据表元素的 addRow() 和 arraylist 以及一个范围为计算第一个元素的支持 bean 会话。在第一个支持 bean 中,我使用一个临时变量来创建新行(它通过更多步骤创建,然后保存到一个数据库中),如果我在 addRow() 中返回新视图,我丢失了临时变量......嗯...... .
    • 似乎还有其他方法,但我还不能尝试。有一个客户端选项可以设置当前页面。见here。你必须添加类似 ‛
    【解决方案4】:

    您可以通过使用绑定来避免代码中的显式 ID:

    xhtml:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2013-09-15
    • 1970-01-01
    • 2012-12-06
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多