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

时间:2014-05-25 14:23:59

标签: jsf-2 primefaces lazy-loading primefaces-extensions datascroller

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

有没有人设法使用实际数据源(例如数据库)实现this data scroller延迟加载?


的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实现决定它应该加载哪个标准?

2 个答案:

答案 0 :(得分:0)

我已经实现了一个由实时数据库支持的DataScroller。

我不确定postEJB会发生什么,所以我无法确定,但你对它的打电话看起来很奇怪。尝试使用调试器(或添加一些记录器消息)以查看向下滚动时是否正在调用load(),并确切查看postEJB.loadLatestPosts()正在返回的内容。我怀疑 - 如果我是推定的话,请原谅我 - EJB调用实际上应该是postEJB.loadLatestPosts(first, pageSize),并且startingFromCHUNK_SIZE可以被抛弃。

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

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

答案 1 :(得分:0)

我遇到了同样的问题。

我的问题是我在LazyDataModel中使用了setRowCount(currentNumberOfRows)。 这导致加载内容恰好两次 - 因为您的问题也是如此。

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