我目前正在尝试实现延迟加载行扩展。 我在rowExpansion中添加了一个dataGrid,其value属性是一个从数据库中获取详细用户的方法。
当我调试此方法(userBacking.getDetailedUserById(Long userId))
时,我发现当我点击一行时,此方法最少被调用5次。
有谁知道为什么这种方法被调用了这么多次?
有没有更好的方法来实现延迟加载行扩展?
<p:dataTable id="myPassengerTable"
value="#{userBacking.userTableData}" var="user"
selection="#{myRoutesBacking.selectedUser}"
selectionMode="single"
emptyMessage="no users">
<p:ajax event="rowSelect" listener="#{userBacking.onRowSelect}" />
<p:ajax event="rowUnselect"
listener="#{userBacking.onRowUnselect}" />
<p:column styleClass="expand#{user.id}"
style="display:none;">
<p:rowToggler />
</p:column>
<p:column >
<h:outputText
value="#{user.username}" />
</p:column>
<p:rowExpansion>
<p:dataGrid var="detailedUser"
value="#{userBacking.getDetailedUserById(user.Id)}"
columns="1" rows="1">
<p:panelGrid>
<p:row>
<p:column>#{detailedUser.firstName} #{detailedUser.lastName}</p:column>
</p:row>
</p:panelGrid>
</p:dataGrid>
</p:rowExpansion>
</p:dataTable>
答案 0 :(得分:1)
当前(PrimeFaces 6+)p:rowToggler
使用Ajax加载,因此默认情况下是惰性的。阅读p:rowExpansion gets rendered even though it's not toggled后,似乎并非总是如此(直到PrimeFaces 5)。因此,如果可能的话,只需升级即可。
对于多个吸气剂调用,如前所述,应检查:Why JSF calls getters multiple times。