【发布时间】:2016-01-02 21:07:44
【问题描述】:
我在我的 Java/JSF 应用程序中使用 PrimeFaces 工具包。我在应用程序中有几个地方会执行一些运行时间相对较长的 Web 服务调用。我想防止用户重复提交呼叫,同时还显示某种“某事”正在发生的迹象,并等待并耐心等待。
为此,我使用了名为“BlockUI”的 PrimeFaces 组件。它正是我需要它做的事情,但是,用我已经存在的验证消息和标记来实现它会出现问题。
问题在于,一旦与按钮按下相关的 ajax 调用完成,UI 的被阻止部分仍然被阻止,即使在下面呈现错误消息之后也是如此。以下是与按钮标记相关的代码:
<h:panelGroup id="formNC3EditPageCenterBox" layout="block"
class="centerBox">
<h:panelGroup id="formNC3EditPageFormGroup" layout="block">
<h:form id="formNC3Form">
<h:panelGroup id="errorMessageContainer" layout="block"
rendered="#{facesContext.isValidationFailed()}">
<h:panelGrid id="errorMessageGrid" columns="2">
<h:graphicImage name="images/error.png" alt="error icon" />
<h:messages class="requiredLabel" layout="table" globalOnly="true" />
</h:panelGrid>
</h:panelGroup>
<h:panelGroup layout="block" id="formNC3SaveAndCancelButtonGroup"
class="centerButtonContainer">
<p:commandButton id="formNC3SaveButton" value="#{labels.save}"
actionListener="#{stateAnnualFormManagedBean.save()}"
update="formNC3Form" />
<h:outputText value=" " />
<h:commandButton id="formNC3CancelButton" value="#{labels.cancel}"
action="#{stateAnnualFormManagedBean.handleCancelAction()}"
ajax="false" />
<p:blockUI widgetvar="block" block="formNC3EditPageCenterBox"
trigger="formNC3SaveButton" animate="false">
<h:graphicImage name="images/ajax-loader.gif" alt="ajax-loader" />
<h:outputText value="#{labels.processing}" />
</p:blockUI>
</h:panelGroup>
</h:form>
</h:panelGroup>
</h:panelGroup>
请注意,这不是整个页面,而是所有功能相关的部分。以下是 Java 支持 bean 的相关部分:
//I call a 'save' method which executes a web service call in a try block
try {
webservice.call(pseudocode);
} catch (ValidationException vx) {
// if validation errors are returned I set something in the faces messages
FacesMessage message = new FacesMessage();
message.setSummary(PageUtilities
.fetchMessage("some.package.name", messageKey, null));
message.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(null, message);
context.validationFailed();
context.renderResponse();
} catch (WebServiceException wx) {
// if the webservice call fails i also set a message
FacesMessage message = new FacesMessage();
message.setSummary(PageUtilities
.fetchMessage("some.package.name", messageKey, null));
message.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(null, message);
context.validationFailed();
context.renderResponse();
}
所以,最终会发生什么,我单击提交按钮,阻止 UI 生效,阻止页面视图。网络服务调用结束,就我而言,现在它失败了。块 UI 主体消失,Web 服务错误呈现在页面顶部 - 但是 - 目标组件的块 UI“变灰”仍然存在。之后我无法点击任何内容,界面仍然被“阻止”。
我怀疑这与将项目更新到 UI 的顺序有关,但我对 JSF 生命周期不够熟悉,尤其是在添加 ajax 和 PrimeFaces 后,不知道在哪里查找错误。任何帮助将不胜感激。
这里是屏幕截图,删除了一些不太重要的信息。您可以看到错误已呈现,但 UI 仍然“被阻止”
** 注意 - 我应该提一下,当我定位按钮面板 ID formNC3SaveAndCancelButtonGroup 时,块 UI 组件可以 100% 完美运行。我对此唯一的抱怨是组件“主体”显示在按钮容器上方,而“灰色”区域仅在按钮容器上方。这当然是可以理解的,但我希望动画和灰色区域出现,如果不是在整个主体上,至少是 Web 应用程序的内容区域。
【问题讨论】:
-
也许这个帖子可以帮助你:stackoverflow.com/questions/12390985/…
标签: jquery ajax jsf jsf-2 primefaces