在标准的 JSF API 中没有这样的东西。在 PrimeFaces 中也没有想到任何东西。对于 PrimeFaces,请参阅最后的更新
然而,OmniFaces <o:componentIdParam>
可能正是您正在寻找的。它允许您让 JSF 根据特定请求参数(可以是组件 ID 或客户端 ID)仅呈现组件树的子集。您基本上可以只使用 jQuery将起始索引作为请求参数$.get()
重新加载,<ui:repeat>
并使用 jQuery$.append()
将其附加到 HTML DOM。
这是一个完整的启动示例。风景:
<!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>
支持bean:
@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):PrimeFacesp:datascroller
具有“按需滚动”的延迟加载功能