由于它是一个新组件,所以可能不那么稳定。
有没有人设法实现这个数据滚动与延迟加载使用实际数据源(例如DB)?
index.xhtml
<p:dataScroller value="#{postLoader.lazyModel}" var="post" lazy="true" chunkSize="5">
<article>
<h:outputText value="#{post.title}" />
<br />
<p:graphicImage value="/files/#{post.blobPath}" />
</article>
<hr />
</p:dataScroller>
PostLoaderBacking
@ManagedBean(name = "postLoader")
@ViewScoped
public class PostLoaderBacking implements Serializable
{
// ==================== 1. Static Fields ==============================
private static final long serialVersionUID = 2732106678777694908L;
private static final int CHUNK_SIZE = 5;
// ==================== 2. Instance Fields ============================
@EJB
private PostEJB postEJB;
private int postCount;
private LazyDataModel<PostEntity> lazyModel;
// ==================== 4. Constructors ===============================
@PostConstruct
public void init()
{
postCount = postEJB.getPostCount();
lazyModel = new LazyDataModel<PostEntity>() {
private static final long serialVersionUID = -4742720028771554420L;
@Override public List<PostEntity> load(final int first, final int pageSize,
final String sortField, final SortOrder sortOrder,
final Map<String, Object> filters) {
final int startingFrom = postCount - first;
return postEJB.loadLatestPosts(startingFrom, CHUNK_SIZE);
}
};
}
// ==================== 7. Getters & Setters ======================
public LazyDataModel<PostEntity> getLazyModel()
{
return lazyModel;
}
}
我的解决方案在一定程度上是有效的。它只加载两个块。例如,如果我的块大小是2(没有双关语),那么它将总共加载4个帖子,尽管我有更多的帖子来自哪里。
为什么它在某个点停止加载?我向下滚动页面,什么也没发生。primefaces实现根据哪些标准决定它是否应该加载?
我已经实现了一个由实时数据库支持的datascroroller。
我不确定postEJB
发生了什么,所以我不能确定,但是你给它打的电话对我来说很奇怪。尝试使用调试器(或添加一些记录器消息)来查看当您向下滚动时是否正在调用load()
,并查看postEJB.loadLatestPosts()
返回的确切内容。我的怀疑——如果我是假定的话,请原谅我——是EJB调用实际上应该是类似于postEJB.loadLatestPosts(first, pageSize)
的东西,并且startingFrom
和CHUNK_SIZE
可以被丢弃。
您可能还想设置数据模型的行数;也就是说,lazyModel.setRowCount(postCount);
我不确定DataScroller是否实际使用它,但它不会伤害。:)
我也遇到过同样的问题。
我的问题是,我使用setRowCount(currentNumberOfRows)在LazyDataModel。这导致内容恰好加载两次-正如您的问题一样。
尝试将rowCount设置为数据库中可用的行的总数。