我在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生效阻止页面视图。 web服务调用结束,就我而言,它现在失败了。块UI主体消失,Web服务错误呈现在页面顶部 - 但是 - 块UI&#39;灰化&#39;目标组件仍然存在。在此之后我无法点击任何内容,界面仍被“阻止”。
我怀疑这与项目更新到UI的顺序有关但我对JSF生命周期不够熟悉,特别是一旦添加ajax和PrimeFaces,就知道在哪里查找错误。任何帮助将不胜感激。
以下是截图,其中删除了一些不太重要的信息。您可以看到错误已呈现,但用户界面仍然被“阻止”
**注意 - 我应该提一下,当我定位按钮面板id formNC3SaveAndCancelButtonGroup
时,块UI组件100%完美地工作。我对此的唯一抱怨是组件&#39; body&#39;显示在按钮容器上,并且“灰显”&#39;区域仅在按钮容器上方。这当然是可以理解的,但我喜欢动画和灰色区域,如果不是整个主体,至少是Web应用程序的内容区域。
答案 0 :(得分:0)
Tomek - 您的建议是正确的。这与尝试两次更新同一节点有关,我移动了块UI以仅阻止页面的一部分并且它正常工作
&#34; trigger属性绑定指定元素上的jQuery侦听器。但是,如果更新元素,则绑定会丢失。我不知道它是否有效,但你可以尝试移动它