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
中提出问题
我正在尝试将 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
中提出问题