JSF PrimeFaces DataScroller mit Lazy Loading und keine Paginierung (infinite-scroll)
Da es eine neue Komponente, die es möglicherweise nicht so stabil.
Hat jemand umsetzen konnte diese Daten scroller mit lazy loading mit einem eigentliche Datenquellen (z.B. 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;
}
}
Meine Lösung funktioniert bis zu einem gewissen Punkt. Es nur lädt zwei Stücke. Zum Beispiel, wenn mein chunk-Größe ist 2 (kein Wortspiel beabsichtigt), dann wird es Last 4 Beiträge insgesamt, obwohl ich noch viel mehr, wo diese kamen.
Warum hört es laden irgendwann? Ich scroll unten auf der Seite und nichts passiert. Auf welche Kriterien muss die primefaces-Implementierung entscheiden, ob es laden soll?
- Die Kriterien für das beladen ist rowcount/pagesize.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich umgesetzt DataScroller unterstützt durch eine live-Datenbank.
Ich bin mir nicht sicher, was passiert, in
postEJB
, so kann ich nicht sicher sein, aber der Aufruf, die Sie machen, es sieht eigenartig zu mir. Versuchen Sie es mit einem debugger (oder das hinzufügen von logger-Nachrichten) um zu sehen, obload()
wird aufgerufen, wenn Sie nach unten scrollen, und genau zu sehen, waspostEJB.loadLatestPosts()
zurück. Mein Verdacht -- und verzeihen Sie mir, wenn ich bin vermutende -- ist, dass die EJB-Aufruf sollte eigentlich so etwas wiepostEJB.loadLatestPosts(first, pageSize)
, und dassstartingFrom
undCHUNK_SIZE
können ditched werden.Können Sie auch wollen, um die Zeilenanzahl der Daten-Modell; D. H.,
lazyModel.setRowCount(postCount);
Ich bin mir nicht sicher, ob die DataScroller tatsächlich verwendet es, aber es könnte nicht Schaden. 🙂
Ich hatte das gleiche problem.
Mein problem war, dass ich verwendet setRowCount(currentNumberOfRows) in der LazyDataModel.
Dies führte in der be-Gehalt ist doppelt so hoch wie Ihr problem auch war.
Versuchen Sie, die Einstellung der Zeilenanzahl, um die Gesamtzahl der Zeilen, die in der Datenbank verfügbar sind.