Primefaces lazy datascroller 调用加载两次

Primefaces lazy datascroller calling load twice

我正在尝试将 Datascroller 与 LazyDataModel 一起使用,但惰性数据模型的加载方法被调用了两次。

除了认为多次调用加载方法不太好(可能会执行昂贵的 server/DB 往返),因为我的惰性数据模型不是幂等的(意思是,连续两次调用模型在相同的 window/page 大小 returns 不同的结果上)它被调用两次的事实意味着:呈现的结果不正确。

datascroller中的load方法调用两次正常吗? 如果是这样,是否建议我的替代方案正常工作的任何解决方法? (除了从有状态数据模型更改为无状态数据模型)

使用 Primefaces 5.1、JSF2、Glassfish 4.1

不,这不正常。这确实是 PrimeFaces 中的一个错误。我们前段时间在zeef.com使用它的时候也发现了它。我们通过创建一个扩展 DataScrollerRenderer 的自定义渲染器并仅覆盖 encodeMarkup() 方法来绕过它,并复制粘贴原始实现,然后仅注释掉以下部分:

// BUGFIX: outcommented as this is already done in loadChunk() later on.
/*if(ds.isLazy()) {
    loadLazyData(ds, 0, chunkSize);
}*/

您可以通过在 webapp 的 faces-config.xml 中如下注册它来获得 运行:

<render-kit>    
    <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.DataScrollerRenderer</renderer-type>
        <renderer-class>com.example.YourDataScrollerRenderer</renderer-class>
    </renderer>
</render-kit>

由于 header 方面,在 BalusC post 中,如果第一个加载(注释部分)没有 运行,则无法正确呈现,因此需要稍微不同的实现方式

public class DataScrollerRenderer2 extends DataScrollerRenderer {

    @Override
    protected void encodeMarkup(FacesContext context, DataScroller ds, int chunkSize) throws IOException {
        // ... 
        boolean alreadyLoaded = false;
        if (ds.isLazy()) {            
            alreadyLoaded = true;
            loadLazyData(ds, 0, chunkSize);
        }
        // ... 
        loadChunk(context, ds, 0, chunkSize, alreadyLoaded);
        // ... 
    }

    @Override
    protected void loadChunk(FacesContext context, DataScroller ds, int start, int size) throws IOException {
        loadChunk(context, ds, start, size, false);
    }

    private void loadChunk(FacesContext context, DataScroller ds, int start, int size, boolean alreadyLoaded) throws IOException {
        // ... 
        if (ds.isLazy() && !alreadyLoaded) {
            loadLazyData(ds, start, size);
        }
        // ... 
    }

}

不确定这是否是最佳实施方式,但它确实有效。

编辑:已在 PrimeFaces GitHub

中提出问题