在p:dataTable中实现LazyDataModel

问题描述 投票:6回答:5

我正在尝试实现具有延迟加载功能的表。我想我已经从演示页面和文档中获取了所有步骤,但始终收到“未找到记录”消息。我认为我已将代码简化为最少的表达,至少应该有一条记录:

表格页面:

<h:form id="listaEmpresas">
<p:dataTable id="tablaEmpresas" value="#{empresasTableMB.lazyDataModel}" var="empresa">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="#{msgs.empresa_tabla_nombre}"/>
                        </f:facet>
                        <h:outputText value="#{empresa.nombre} "/>
                    </p:column>

</p:dataTable>
</h:form>

LazyDataModel:

@Override
public List<Empresa> load(int first, int pageSize, String sortField, SortOrder so, Map<String, String> filters) {
    List<Empresa> listaEmpresas = new ArrayList();
    Empresa e = new Empresa();
    e.setNombre("Company");
    listaEmpresas.add(e);
    this.setRowCount(1);
    return listaEmpresas;
 }


@Override
public void setRowIndex(int rowIndex) {
    if (rowIndex == -1 || getPageSize() == 0) {
        super.setRowIndex(-1);
    }
    else
        super.setRowIndex(rowIndex % getPageSize());
}

我必须重写setRowIndex或得到异常“ java.lang.ArithmeticException:/零”。我正在使用primefaces-3.1-SNAPSHOT,jsf 2.0.3和tomcat 6.0。请帮忙。我缺少什么?

jsf-2 primefaces
5个回答
2
投票

在数据表中添加lazy=true。添加此数据表后,便可以调用您的load()方法。


1
投票

您需要添加字段private int rowCount;然后在load(...)方法中,将列表中记录数的值设置为此字段(rowCount)。没有此内容,<p:dataTable ...>将获得“找不到记录”,并且如果您未指定rows ="10"(例如)属性,它将不会呈现行!


0
投票

您还需要实现LazyDataModel#getRowKeyLazyDataModel#getRowData

假设您有类似的东西:

class Empresa {

    private long id;
    private String nombre;

    // getters and setters...

}

然后:

  • [getRowKey返回Empresa对象的ID
  • [getRowData通过ID获取Empresa对象
class MyLazyDataModel {

    // stuff you already have comes here...

    public Empresa getRowData(String rowKey) {
        return empresaRepository.getEmpresaById(Long.valueOf(rowKey));
    }

    public Object getRowKey(Empresa empresa) {
        return empresa.getId();
    }

}

0
投票

https://code.google.com/p/primefaces/issues/detail?id=1544中对此行为进行了描述,显然,您可以通过显式调用lazyDataModel.setPageSize();来避免此行为>

这里有相关文章:

Primefaces DataTable + JPA / Hibernate Pagination


0
投票

您没有调用load方法。在素面数据表声明之前先调用load方法。

© www.soinside.com 2019 - 2024. All rights reserved.