Как динамически изменить setRowCount для отложенной загрузки p:datatable

У меня есть ситуация, когда нумерация страниц должна быть динамически. Это означает, что он должен меняться при каждом вызове метода загрузки.

Я хочу, чтобы установить метод 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() на динамическое значение, это не будет отражать его первоначальное значение, которое было установлено впервые.

1 ответ

PrimeFaces не поддерживает это из коробки. 11 февраля 2016 г. было исправлено исправление транка с тегом 6.0 (поэтому оно должно быть как минимум в текущих выпусках 6.0RCx). Я не уверен, что это в версии Elite >=5.2.20 или>=5.3.7 (от 12 февраля)

Одна из важных причин того, что это не работает, заключается в том, что обновленный rowCount, который вы можете сделать в методе загрузки на стороне сервера, не применяется к клиентской части paginator. Однако, поскольку он передается с сервера на клиент, вы можете обновить его при завершении каждого вызова ajax (страница, сортировка, фильтр). Фактически, это большая часть патча (другая часть читает значение из ответа 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+1 (но все равно вернуть записи pageSize)
  • Установите количество равным количеству прочитанных строк, если они имеют размер страницы или меньше.

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}" >
Другие вопросы по тегам