p:在Ajax调用完成后,blockUI仍然被阻止

时间:2015-10-06 04:18:50

标签: jquery ajax jsf jsf-2 primefaces

我在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="&#160;" />
                <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,就知道在哪里查找错误。任何帮助将不胜感激。

以下是截图,其中删除了一些不太重要的信息。您可以看到错误已呈现,但用户界面仍然被“阻止”

enter image description here

**注意 - 我应该提一下,当我定位按钮面板id formNC3SaveAndCancelButtonGroup时,块UI组件100%完美地工作。我对此的唯一抱怨是组件&#39; body&#39;显示在按钮容器上,并且“灰显”&#39;区域仅在按钮容器上方。这当然是可以理解的,但我喜欢动画和灰色区域,如果不是整个主体,至少是Web应用程序的内容区域。

1 个答案:

答案 0 :(得分:0)

Tomek - 您的建议是正确的。这与尝试两次更新同一节点有关,我移动了块UI以仅阻止页面的一部分并且它正常工作

&#34; trigger属性绑定指定元素上的jQuery侦听器。但是,如果更新元素,则绑定会丢失。我不知道它是否有效,但你可以尝试移动它