我需要根据 PrimeFaces LazyDataModel<T>
返回的行数来渲染一些组件.
例如,<p:panelGrid>
仅当关联的惰性数据模型返回至少一行时才应呈现。
<p:panelGrid rendered=#{bean.rowCount gt 0}>
...
...
...
</p:panelGrid>
下面给出了 <p:dataList>
这是延迟加载的。
<p:dataList var="row"
value="#{bean}"
first="0"
rows="10"
paginator="true"
lazy="true">
...
...
...
<p:dataList>
这个 bean 很普通:
@Named
@ViewScoped
public class Bean extends LazyDataModel<Entity> implements Serializable
{
@Inject
private BeanService service;
private static final long serialVersionUID = 1L;
@Override
public List<Entity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters)
{
setRowCount(service.rowCount());
return service.getList(first, pageSize);
}
}
给定的<p:panelGrid>
当 rendered
时,将不再渲染,因为惰性数据模型不可用。 <p:panelGrid>
的属性已处理。
如果两者的顺序都是<p:panelGrid>
,则正确的事情可能会发生。和<p:dataList>
是互换的,但这是一个设计问题,不能考虑。
给定的<p:dataList>
包含用于预览的复杂报告数据列表(与 <p:dataTable>
、 <p:panelGrid>
和其他一些组合),然后将其导出到 MS-Excel 工作簿并下载文件。
报告数据列表(由 <p:dataList>
保存)取决于多个(自定义)过滤器,这些过滤器由 <p:inputText>
组成。 , <p:selectOneMenu>
等等。该列表是根据过滤器值/事件进行 AJAX 更新的。
列表随时可能为空,具体取决于过滤器的值。无论如何,如果<p:dataList>
为空,<p:panelGrid>
不得渲染( <p:panelGrid>
只是一个简单的示例。还有其他组件)。
如何根据 LazyDataModel<T>
返回的行数来渲染此类组件(最终来自关联的数据库)没有任何额外的开销来执行额外的 JPA 查询来计算根据过滤器的值可以返回的行数(当已经有非常复杂/昂贵的报告 JPA 标准查询正在执行时)?
最佳答案
当您在 load
中设置行数时,您可能会移动
setRowCount(service.rowCount());
进入加载之前执行的方法(或者在行计数的 getter 中作为最后一种可能性),因为我假设 service.rowCount()
本身不执行加载,或者我是错了?
关于jsf - 根据 PrimeFaces LazyDataModel<T> 返回的行数渲染 JSF/PrimeFaces 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287477/