在标准的 JSF API 中没有类似的情况。在PrimeFaces中也没有什么想到的。对于PrimeFaces,请参阅末尾的更新
然而,OmniFaces <o:componentIdParam>
可能正是您正在寻找的。它允许您让 JSF 仅基于特定请求参数呈现组件树的子集,该参数可以是组件 ID 或客户机 ID。你基本上可以使用jQuery的$.get()
将和起始索引一起重新加载作为请求参数,并使用jQuery的$.append()
将其附加到HTML DOM。<ui:repeat>
下面是一个完整的启动示例。视图:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
>
<f:metadata>
<o:componentIdParam componentIdName="componentId" />
</f:metadata>
<h:head>
<title>Stack Overflow Question 11364006</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script> <!-- Substitute with PrimeFaces' one, if necessary. -->
</h:head>
<h:body>
<ul id="items">
<ui:repeat id="itemsRepeater" value="#{bean.items}" var="item">
<li>#{item}</li>
</ui:repeat>
</ul>
<input type="button" id="showMore" value="Show more"/>
<h:outputScript>
$("#showMore").click(function() {
$items = $("#items");
var params = { start: $items.find("li").length, componentId: "itemsRepeater" };
$.get(location, params, function(html) {
$items.append(html);
});
});
</h:outputScript>
</h:body>
</html>
背豆:
@ManagedBean
@RequestScoped
public class Bean {
private List<String> items;
@ManagedProperty("#{param.start}")
private int start;
@PostConstruct
public void init() {
// Just a stub. Do your thing to fill the items.
items = new ArrayList<String>();
int size = start + 10;
for (int i = start; i < size; i++) {
items.add("item " + (i + 1));
}
}
public void setStart(int start) {
this.start = start;
}
public List<String> getItems() {
return items;
}
}
更新:可以在当前展示应用程序的<o:componentIdParam>
页面的“可扩展列表”示例中找到实时演示。
更新2):PrimeFaces具有“按需滚动”的延迟加载p:datascroller