2016-05-12 51 views
1

我有:Primefaces PAGINATE懒惰的DataTable不计排

在我的豆
    <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="myTable" /> 
        ... 
        </p:dataTable> 

    ... 
        private LazyDataModel list; 
        ...      
        public void search() { 
         list = new LazyDataModel<SomeDTO>() { 
          private static final long serialVersionUID = 1L; 
          List<SomeDTO> result = null; 

          @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           // SOME CODE HERE FOR PAGINATION ?? BUT WHAT 
           return result; 
          } 

         }; 
         // HOW TO DELETE THIS EXTRA REQUEST 
         list.setRowCount(service.search(searchedName)); 
        } 

我的问题是如何从结果(大小+ 1)setRowCount。我不想从数据库中获取数据,因为我确信我们可以在不请求数据库的情况下计算rowCount。

回答

-1

好吧,我明白了。 先在你的页面,你需要这样的:

    <p:remoteCommand name="updateMyTable" update="#{p:component('myTable')}" process="@this" /> 
        <p:dataTable id="myTable" lazy="true" widgetVar="myTable" value=".." paginator="true" paginatorPosition="bottom" rows="10" ...> 
        <p:ajax event="page" oncomplete="updateMyTable()" /> 
        ... 
        </p:dataTable> 

在bean改变负载的方法是这样的:

      @Override 
          public List<SomeDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {          
           List<SomeDTO> result = service.search(searchedName, first, pageSize); 
           if (first <= pageSize) { 
            this.setRowCount(this.getRowCount() + result.size() + 1); 
           } else if (result != null && result.size() > 0 && (result.size() >= pageSize)) { 
            this.setRowCount(this.getRowCount() + result.size()); 
           } 
           return result; 
          } 
+0

这会更新数据表。两次。查询被执行两次...不是我想的。 – Kukeltje

+0

不管先生何先生都知道,在判断人员之前,先阅读问题和解决方案。显然,你不知道primefaces数据表的懒惰加载和它是如何工作的! –

+0

首先,我不是在判断人,我在判断答案。虽然它可能在技术上有效,但它不是一个有效的解决方案,也不是必需的。显而易见你说的是阅读答案。 **我是创建了我接受的PrimeFaces补丁的人,你注意到了吗?**我在论坛和旧版本的发行者中为PrimeFaces数据表提供了多项其他改进建议,包括嵌套在数据表中重复一遍。我有那些在我的环境中工作了很长时间,所以我知道**延迟加载**。所以请在判断人员之前直接获取记录** – Kukeltje

-1

Primefaces分页懒惰的DataTable需要两个查询,查询返回一个页面的结果作为限制,另一个查询知道数据的总大小。

+1

这两个查询是没有必要的,我们可以计算页数动态地从我们的服务返回列表的大小+ 1, 这个解决方案的优点是我们不必复制服务方法从db获取计数,特别是对于非常复杂的搜索查询。 –

2

PrimeFaces不支持开箱即用。 A fix has been checked in to trunk on Feb 11th 2016, tagged 6.0(所以它应该至少在目前的6.0RCx版本中)。我不确定它是否在Elite版本中> = 5.2.20或> = 5.3.7(从2月12日开始)

这种不工作的一个重要原因是更新后的rowCount可能会在负载方法服务器端是而不是应用于分页程序客户端。但是,由于从服务器传输到客户端,因此您可以在每个ajax调用的完成时更新它。实际上,这是patch的很大一部分(另一部分是从ajax响应中读取值)。

结合在例如一个AJAX页面事件的onComplete将解决这一问题:

function updatePaginator(xhr, status, args) { 
    var paginator = PF('DataTableWidgetVar').paginator; 
    paginator.cfg.rowCount=args.totalRecords; 
    paginator.cfg.pageCount = Math.ceil(value/paginator.cfg/rows)||1; 
    paginator.updateUI(); 
} 

然后,您可以在load方法每次调用, - 尝试阅读页面大小+ 1点的记录 - 设置计数到这一点,如果你可以阅读pageSize + 1(但仍返回pageSize记录) - 将计数设置为读取的行数(如果它们的页面大小为或更小)。

+0

如果你看我的解决方案,我有:此命令在ajax页面后重新刷新数据表。我已经测试过它,它完美的工作。 如果你不确定在你的答案不要发布它。 –

+0

有两个请求p:ajax页面事件和其他p:remoteCommand。但这不是问题。我的问题是避免请求数据库获取计数行不可数据。 –

+0

这是与p:remoteCommand负载数据表的另一个问题是执行两次..你知道如何刷新数据表没有p:remoteCommand我试过update =“datatable”,但不工作? –