JSF PrimeFaces具有延迟加载和无分页(无限滚动)的datascrorolller



由于它是一个新组件,所以可能不那么稳定。

有没有人设法实现这个数据滚动与延迟加载使用实际数据源(例如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)的东西,并且startingFromCHUNK_SIZE可以被丢弃。

您可能还想设置数据模型的行数;也就是说,lazyModel.setRowCount(postCount);

我不确定DataScroller是否实际使用它,但它不会伤害。:)

我也遇到过同样的问题。

我的问题是,我使用setRowCount(currentNumberOfRows)在LazyDataModel。这导致内容恰好加载两次-正如您的问题一样。

尝试将rowCount设置为数据库中可用的行的总数。

相关内容

  • 没有找到相关文章

最新更新