如何动态更改p:datatable的延迟加载的setRowCount

时间:2013-10-16 06:39:02

标签: jsf jsf-2 primefaces

我的情况是分页应该是动态的。这意味着它应该随着load方法的每次调用而改变。

我想动态设置setRowCount()方法并为dataTable提供分页

@Override
public List<ProjectMasterModel> load(int first,int pageSize,StringsortField, SortOrder sortOrder, Map<String, String> filters) {
    List<ProjectMasterModel> data=new ArrayList<ProjectMasterModel>();
    LazyDataModel<ProjectMasterModel> newdata = null;
    ProjectMilestoneDaoImpl milestoneDaoImpl=(ProjectMilestoneDaoImpl) ObjectFactory.getBean("projectMilestoneDao");
    SessionFactory sessionFactory=(SessionFactory) ObjectFactory.getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();

    try{
        data.addAll(milestoneDaoImpl.populateLazyRandomProjects(first,pageSize));
        setRowCount(milestoneDaoImpl.getRowCount_Of_ProjectList());

        // very important line to show the pagination

    }catch(Exception e){
        CmsLogger.errorLog(LazyProjectDataModel.class, e);
    }finally{   
        sessionFactory.getCurrentSession().close();
    }

    if(sortField != null)
       Collections.sort(data,new ProjectMasterModel());

    return data;
}

这里我使用了一个查询来获取数据大小来设置行数。 在给定的情况下,它们可能是添加到数据库的记录数。 所以分页应该动态增加。 但是,如果我将setRowCount()方法更改为动态值,则它不会反映它保留其第一次设置的原始值。

2 个答案:

答案 0 :(得分:1)

PrimeFaces不支持开箱即用。 A fix has been checked in to trunk on Feb 11th 2016, tagged 6.0(因此至少应该在当前的6.0RCx版本中)。我不确定它是否属于Elite版本&gt; = 5.2.20或&gt; = 5.3.7(从2月12日起)

这种方法无效的一个重要原因是,您可能在加载方法服务器端执行的更新的rowCount 应用于分页器客户端。但是,由于从服务器传输到客户端,您可以在每个ajax调用(页面,排序,过滤器)的oncomplete中更新它。事实上,这是patch的很大一部分(另一部分是从ajax响应中读取值)。

结合使用例如ajax页面事件的完成将解决问题:

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

然后,您可以在加载方法的每次调用中

  • 尝试阅读pageSize + 1条记录
  • 如果您可以阅读pageSize + 1(但仍返回pageSize记录),请将计数设置为此(pageSize + 1)
  • 如果计数为pageSize或更小,则将计数设置为读取的行数。

答案 1 :(得分:1)

MyMB.java

List<NameClass> listResult = new LazyDataModel<NameClass>() {

  private static final long serialVersionUID = 1L;

  @Override
  public List<NameClass> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {

    List<NameClass> result = dao.findReg(....., pageSize, page);
    setRowCount(numberOfResult);
    return result;
  }
};

getListResult() {..}
setListResult(List<NameClass> l ) {...}

myPage.xhtml

<p:dataTable lazy="true" 
 value="#{myMB.listResult}" 
 var="model" 
 paginator="true"
 rows="#{myMB.pageSize}" 
 paginatorPosition="bottom" 
 paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" >