2013-10-16 47 views
3

我有一種情況,應該是動態分頁。這意味着它應該隨每次調用load方法而改變。如何更改p:datatable的lazyloading的setRowCount動態

我想動態設置setRowCount()方法,並給予分頁的數據表

@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()方法更改爲動態值,則不會反映它保持其第一次設置的原始值。

回答

1

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方法每次調用,

  • 嘗試讀取的pageSize + 1點的記錄
  • 設置計數這個(的pageSize + 1),如果你能讀的pageSize + 1(但仍返回pageSize的記錄)
  • 設置計數讀的行數,如果他們的pageSize以下。