Primefaces 筛选时加载Datatable扩展内容
我有一个使用rowExpansion的嵌套数据表。展开行时,将正确加载每个嵌套表的内容。但是,当筛选器应用于根表时,将加载所有嵌套表的内容。如果有很多行,这会降低性能 请注意,这不是“JSF多次调用getter”问题。扩展行的内容缓存在备份中。它的行为就像在应用过滤器之前展开每一行一样。请注意,筛选器只涉及“value”属性,而不涉及作为扩展内容的“strings”Primefaces 筛选时加载Datatable扩展内容,primefaces,jsf-2.2,Primefaces,Jsf 2.2,我有一个使用rowExpansion的嵌套数据表。展开行时,将正确加载每个嵌套表的内容。但是,当筛选器应用于根表时,将加载所有嵌套表的内容。如果有很多行,这会降低性能 请注意,这不是“JSF多次调用getter”问题。扩展行的内容缓存在备份中。它的行为就像在应用过滤器之前展开每一行一样。请注意,筛选器只涉及“value”属性,而不涉及作为扩展内容的“strings” <p:dataTable value="#{backing.elements}" var="row" filteredV
<p:dataTable value="#{backing.elements}" var="row"
filteredValue="#{backing.elementsFiltered}">
<p:column>
<p:rowToggler />
</p:column>
<p:column headerText="Value" filterBy="#{row.value}">
<h:outputText value="#{row.value}" />
</p:column>
<p:rowExpansion>
<p:dataTable value="#{row.strings}" var="string">
<p:column headerText="Strings">
<h:outputText value="#{string}" />
</p:column>
</p:dataTable>
</p:rowExpansion>
</p:dataTable>
支持bean:
@Named
@ViewScoped
public class Backing implements Serializable {
private List<Element> elements;
private List<Element> elementsFiltered;
@PostConstruct
public void init() {
// Load the list of elements.
}
public List<Element> getElements() {
return elements;
}
public List<Element> getElementsFiltered() {
return elementsFiltered;
}
public void setElementsFiltered(List<Element> elementsFiltered) {
this.elementsFiltered = elementsFiltered;
}
}
@Named
@视域
公共类支持实现可序列化{
私有列表元素;
过滤的私有列表元素;
@施工后
公共void init(){
//加载元素列表。
}
公共列表getElements(){
返回元素;
}
公共列表getElementsFiltered(){
返回元素过滤;
}
public void setElementsFiltered(List elementsFiltered){
this.elementsFiltered=elementsFiltered;
}
}
实体:
public class Element {
private String value;
private List<String> strings;
public String getValue() {
return value;
}
// This getter is called for a particular row when it is expanded.
// But it is called for all rows when the table is filtered.
public List<String> getStrings() {
if (strings == null) {
// Expensive opperation to load the strings.
}
return strings;
}
}
公共类元素{
私有字符串值;
私有列表字符串;
公共字符串getValue(){
返回值;
}
//展开特定行时,将为该行调用此getter。
//但在筛选表时,会对所有行调用它。
公共列表getStrings(){
if(strings==null){
//加载字符串的操作非常昂贵。
}
返回字符串;
}
}
这是虫子吗?还是我做错了什么
Primefaces 5.3.0、JSF2.2、JavaEE7.0那么这在数据表的排序、分页或初始加载时不会发生?然后延迟加载行扩展内容?排序和初始加载时不会发生这种情况。但是,分页时确实会发生这种情况,但仅限于当前页面上的元素。是的,它很懒。我尽可能地简化了示例,但严格来说,扩展内容是通过JPA使用@OneToMany(fetch=FetchType.LAZY)加载的。就这个“问题”而言,您可以尝试6.0-SNAPSHOT吗?是的,我会尝试snapshotOff主题(有点):就个人而言,我总是使用懒散加载(以及相关的过滤等)。