3

我很难对 JSF、AJAX 和 JavaScript 进行网格化。这是我正在尝试做的事情:

当用户提交表单时,他们会被定向到新页面。该页面最初检查他们的提交是否已被处理,如果没有,则显示一个进度条(请参阅Twitter Bootstrap)。然后,我使用 f:ajax 来检查它是否已完成处理。调用waitForProcessing方法;它只是等到处理设置为true,然后返回true。此时,f:ajax 应该调用 JavaScript 将进度条设置为不可见,然后更新页面。这是代码:

<ui:define name="content">

        <c:choose>
            <c:when test="#{not submission.isIsProcessed}">
                <f:ajax onevent="setVisibility('processing-dialog', 'none'); setVisibility('processing-backdrop', 'none');" listener="#{submission.waitForProcessing}" status="success" />

                <div class="modal-backdrop fade in" id="processing-backdrop"></div>
                <div id="processing-dialog" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false" style="display: block;">
                    <div class="modal-header">
                        <h3 id="myModalLabel">One sec...</h3>
                    </div>
                    <div class="modal-body">
                        <p>We are compiling and running your code!</p>
                        <div class="progress progress-striped active">
                            <div class="bar" style="width: 40%;"></div>
                        </div>
                    </div>
                </div>
            </c:when>
        </c:choose>
.......
.......

很多事情在这里都行不通。首先, f:ajax 抛出异常,因为显然 f:ajax 只能嵌套在某些组件中。有一个更好的方法吗?目标是在后端处理完成之前显示进度条。此处理可能需要几分钟,这就是为什么我遇到麻烦并且在数据准备好之前不让页面自行加载。

4

1 回答 1

0

您的问题是f:ajax只执行一次。如果您想多次执行同一个 ajax 调用,您应该使用仅在 PrimeFaces、RichFaces 等框架中可用的轮询组件。RichFaces 有一个与您描述的完全一样的组件(它在内部使用投票)。你可以在这里查看:RichFaces 进度条

于 2013-04-30T09:11:54.407 回答