我们有一个基于JBoss 7.1, JSF2 和Primefaces 3.3 的Web应用程序。
在我们的其中一个页面上,有ui:repeat
10个项目可供显示;然后用户可以单击某种“显示更多”按钮,并且通过ajax显示更多的10个项目。用户可以单击“显示更多”按钮,直到没有其他项目可以显示为止。注意:这不是分页,每单击一次“显示更多”,显示的列表就会变长。
实际上,当用户单击按钮时,服务器将返回旧项目和新项目,并且JSF的客户端每次必须通过jQuery重建整个转发器。
我们希望找到一个更好,性能更高的解决方案。旧项目在 n-1 和 n 调用之间不会改变,因此如果服务器只能通过ajax返回10个新项目,则效率会更高。
JSF2中可能吗?JSF似乎并不真正符合这种递归渲染。可能可以帮助我们的唯一组件是TreeNode组件,但似乎有点hack:-/
标准JSF API中没有类似的东西。
在PrimeFaces中也没有想到。
对于PrimeFaces,请参阅最后的更新
但是OmniFaces
<o:componentIdParam>
可能正是您要寻找的。它允许您让JSF根据特定的请求参数仅呈现组件树的子集,该参数可以是组件ID或客户机ID。您基本上可以只使用jQuery
$.get()
来<ui:repeat>
将start索引和start索引一起重新加载为请求参数,然后使用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>
支持豆:
@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
具有“按需滚动”的延迟加载
问题内容: 我有一个表单,当我单击“提交”时,应该更新同一页面上的部分文档…当我将其放置在此处时: 它按照应有的方式运行,在需要时显示问候。但是当我进入这个… 它根本不做任何事情。我究竟做错了什么? 问题答案: 该请求可能不是Ajax调用。拨打Ajax电话。用户remote_form_for代替form_for或使用jquery.form向控制器发送ajax调用。如果您使用的是jquery,请执行
我有一个flatMap链,在一个flatMap中,当它发出错误时,我想回到flatMap链的一部分,我尝试使用缓存和重试操作符,但dispose()无法阻止它
问题内容: 我想在Rails应用程序的“新”视图中每3秒重新加载部分内容。 我有这个 如何每3秒重新加载一次此部分内容?我是否必须为此使用兼容的JavaScript?如何通过ujs实现呢? 问题答案: 将部分放在div中 您可以通过使用像这样的jQuery来做到这一点 现在刷新控制器动作中的部分内容以加载新内容 它肯定会工作.........
考虑这对简单的函数模板。 如果我们使用非const参数调用:
问题内容: 我正在使用以下Java代码从Internet下载文件: 我想知道是否可以下载文件的一部分。例如,对于5MB的文件,下载最后2MB。 问题答案: 如果服务器支持(并且HTTP 1.1服务器 应支持 ),则可以使用范围请求: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 此外,一次读取一个字符的效率非常低-您