1

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

有没有人设法 使用实际数据源(例如 DB)通过延迟加载来实现这个数据滚动器?


索引.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 实现根据哪些标准决定是否应该加载?

4

2 回答 2

1

我有同样的问题。

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

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

于 2014-06-09T19:22:42.817 回答
0

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

我不确定 中会发生什么postEJB,所以我不能确定,但​​你对它的调用对我来说看起来很奇怪。尝试使用调试器(或添加一些记录器消息)来查看load()向下滚动时是否正在调用,并查看postEJB.loadLatestPosts()返回的确切内容。我的怀疑——如果我是假定的,请原谅我——EJB 调用实际上应该是类似postEJB.loadLatestPosts(first, pageSize)的,startingFrom并且CHUNK_SIZE可以放弃。

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

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

于 2014-06-04T21:32:36.480 回答