当前位置: 首页 > 面试题库 >

如何部分重载ui:repeat?

潘弘扬
2023-03-14
问题内容

我们有一个基于JBoss 7.1, JSF2 和Primefaces 3.3 的Web应用程序。

在我们的其中一个页面上,有ui:repeat10个项目可供显示;然后用户可以单击某种“显示更多”按钮,并且通过ajax显示更多的10个项目。用户可以单击“显示更多”按钮,直到没有其他项目可以显示为止。注意:这不是分页,每单击一次“显示更多”,显示的列表就会变长。

实际上,当用户单击按钮时,服务器将返回旧项目和新项目,并且JSF的客户端每次必须通过jQuery重建整个转发器。

我们希望找到一个更好,性能更高的解决方案。旧项目在 n-1n 调用之间不会改变,因此如果服务器只能通过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 此外,一次读取一个字符的效率非常低-您