Jsf CommandLink在惰性加载的Primefaces数据克隆程序上不工作

Jsf CommandLink在惰性加载的Primefaces数据克隆程序上不工作,jsf,primefaces,lazy-loading,jsf-2.2,datascroller,Jsf,Primefaces,Lazy Loading,Jsf 2.2,Datascroller,我在延迟加载组件方面遇到问题 我有一个jsf页面,页面加载时应该显示10个事件。如果用户希望看到更多内容,可以单击“更多”按钮加载并显示接下来的10个事件。对于每个事件行,都有一个可用于显示事件详细信息的链接 #{event.name} 初始搜索工作正常,也就是说,当我单击view event details链接时,我的支持bean被调用,我看到收到的索引和事件与我单击的行相对应 但是,一旦我加载下一个区块(由1个额外事件组成),页面将显示11个事件,但单击“查看事件详细信息”链接会发送正确

我在延迟加载组件方面遇到问题

我有一个jsf页面,页面加载时应该显示10个事件。如果用户希望看到更多内容,可以单击“更多”按钮加载并显示接下来的10个事件。对于每个事件行,都有一个可用于显示事件详细信息的链接


#{event.name}
初始搜索工作正常,也就是说,当我单击view event details链接时,我的支持bean被调用,我看到收到的索引和事件与我单击的行相对应

但是,一旦我加载下一个区块(由1个额外事件组成),页面将显示11个事件,但单击“查看事件详细信息”链接会发送正确的索引,但不会发送正确的事件。例如,如果我单击索引0处的事件,我将获得索引10处的事件,如果我单击索引1处的事件,我的支持bean将不会被调用

当我单击“更多”按钮时,datascroller似乎忘记了最后10个事件,但我的惰性数据模型仍然记得

支持bean:

@ManagedBean(name=“backing”)
@视域
公共类DataScrollerBack实现可序列化{
私有静态最终长serialVersionUID=4012320411042043677L;
私有静态最终记录器Logger=Logger.getLogger(datascrollerback.class);
@ManagedProperty(“#{settings.dataSource}”)
私有字符串数据源;
私有WebEventDAO-WebEventDAO;
私人LazyDataModel lazyModel;
@施工后
公共void init(){
webEventDAO=CommonDAOFactory.getInstance(数据源).getWebEventDAO();
搜索();
}
公开无效搜索(){
日期时间开始=新的日期时间(2014,1,1,0,0,0);
最终日期startDate=start.toDate();
final Date endDate=start.plus(Years.ONE.toPeriod()).减号(Seconds.ONE.toPeriod()).toDate();
lazyModel=新的LazyDataModel(){
私有静态最终长SerialVersionId=1231902031619933635L;
private LinkedHashSet eventCache;//到目前为止检索到的所有事件的有序集。
//我之所以使用set,是因为load方法在页面加载时被调用了两次(知道为什么吗?),而且我不希望缓存中出现重复项。
@凌驾
公共列表加载(int-first、int-pageSize、字符串排序字段、排序器排序器、映射过滤器){
列表事件=新的ArrayList(10);
试一试{
if(eventCache==null){
int count=webEventDAO.getSearchByPeriodRaceTypeAndRaceStatusForCompanyCount(Collections.singletonList(1),startDate,endDate,null,null);
这个.setRowCount(count);
eventCache=新LinkedHashSet(计数);
}
events=webEventDAO.searchByPeriodRaceTypeAndRaceStatusForCompany(Collections.singletonList(1)、startDate、endDate、null、null、true、first、pageSize);
eventCache.addAll(事件);
}捕获(DAOE){
error(“检索事件时出错。”,e);
}
返回事件;
}
};
}
public void initViewEventDetails(整数索引,事件){
LOGGER.info(“index=“+index+”eventname=“+event.getName());
}
公共字符串getDataSource(){
返回数据源;
}
公共void setDataSource(字符串数据源){
this.dataSource=数据源;
}
公共LazyDataModel getLazyModel(){
返回lazyModel;
}
公共无效setLazyModel(LazyDataModel lazyModel){
this.lazyModel=lazyModel;
}}
由于页面显示正确的信息,并且收到的索引始终有效,因此我当前的解决方法是按索引获取惰性数据模型中的事件

但是,我想了解为什么收到的事件不是我单击的事件

是我做错了什么,还是这就是滚动条的实现方式


在Mojarra 2.2、Tomcat 7、Primefaces 5、Omnifaces 1.8上运行,我终于有时间解决这个问题,并找到了一个解决方法。这是一种黑客行为,所以可能正确的解决方案是使用不同的组件或创建自己的组件

似乎Primefaces在将DataScroller与LazyDataModel一起使用时会遇到DataScroller限制。该组件似乎不是为实现这一点而设计的

为了避免这个问题,我实现了自己的延迟加载,除了新添加的元素之外,还返回了相同的列表实例

下面是我的上一个示例,它经过修改以实现这种新的延迟加载模式:

html页面:


#{event.name}
DataScroller不再具有lazy=“true”、chunkSize=“10”,而是使用一个名为events的列表作为值,并声明一个空的加载程序方面(以避免在到达列表底部时自动加载更多内容)。我使用了一个commandLink调用backing.loadMore()并更新表单以替换loader方面

支持bean:

@Named(“backing”)
@视域
公共类DataScrollerBack实现可序列化{
私有静态最终长serialVersionUID=4012320411042043677L;
私有静态最终记录器Logger=Logger.getLogger(datascrollerback.class);
私有静态最终整数块大小=10;
@数据源
@注入
私有字符串数据源;
私有WebEventDAO-WebEventDAO;
私人列表活动;
私有整数totalCount;
私人日期开始日期;
私人日期结束日期;
@施工后
公共void init(){
webEventDAO=CommonDAOFactory.getInstance(数据源).getWebEventDAO();
搜索();
}
公开无效搜索(){
日期时间开始=新的日期时间(2014,1,1,0,0,0);
startDate=start.toDate();
endDate=start.plus(Years.ONE.toPeriod()).减号(Seconds.ONE.toPeriod()).toDate();
试一试{
totalCount=webEventDAO.getSearchByPeriodRaceTypeAndRaceStatusForCompanyCount(Collections.single
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:body>

        <ui:composition>
            <p:dataTable id="#{id}" widgetVar="#{id}"
                         value="#{requestCache.getLazy(id, () -> dataSource)}" var="rpo"
                         selectionMode="single" selection="#{selection}"
                         lazy="true" paginator="true" rows="#{pageSizeController.pageSize}"
                         pageLinks="10" paginatorPosition="top"
                         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                         currentPageReportTemplate="(#{label.Page} {currentPage} #{label.of} {totalPages}, #{label.Row} {startRecord} - {endRecord} #{label.of} {totalRecords})"
                         rowsPerPageTemplate="5 10 20 30 40 50 100"
                         scrollable="true" scrollHeight="#{empty scrollHeight ? 300 : scrollHeight}"
                         resizableColumns="true" emptyMessage="#{label.Table_is_empty}">
    <p:column>
                    <h:outputText value="#{rpo.decreeSequence.code}" />
                    <p:commandLink id="displayAdditionalInfoCommandLink" type="link" style="float: right; text-decoration: none"
                                   onclick="displayAdditionalInfo([{name: 'refundPaymentOrderId', value: #{rpo.id}}])"
                                   title="#{label.Additional_information}">
                        <h:outputLabel for="displayAdditionalInfoCommandLink" styleClass="fa fa-info-circle"
                                       onmouseover="jQuery(this).addClass('fa-lg').css('cursor', 'pointer')"
                                       onmouseout="jQuery(this).removeClass('fa-lg')"/>
                    </p:commandLink>
                </p:column>
</p:dataTable>
            <p:remoteCommand name="displayAdditionalInfo" process="@this" update="@parent">
                <f:setPropertyActionListener target="#{refundPaymentOrderCache.refundPaymentOrder}"
                                             value="#{refundPaymentOrderRepo.find(requestCache.toLong(param['refundPaymentOrderId']))}" />
                <f:actionListener binding="#{dialog.displayInputForm('RPO_ADDITIONAL_INFO')}" />
            </p:remoteCommand>
</ui:composition>
    </h:body>
</html>