1

在显示编辑对话框之前,加载 gif 用于显示进度。

<p:dataTable id="accounts">
    <p:column>
        <p:commandButton
            action="#{accountsBean.initializeAccount}" process="@this"
            oncomplete="accountsDialogWidget.show()" update=":accountsDialog">                                   
        </p:commandButton>
    </p:column>
</p:dataTable>

<p:dialog id="accountsDialog"
    widgetVar="acccountsDialogWidget" dynamic="true" modal="true">        
    <h:form id="objectWizardForm">
        ...
    </h:form>
</p:dialog>

ajaxStatus组件是这样的:

<p:ajaxStatus id="loading">
    <f:facet name="start">
        <h:graphicImage name="loading.gif" library="images" styleClass="loadingStatus" />
    </f:facet>
    <f:facet name="complete">
        <h:outputText value="" />
    </f:facet>
</p:ajaxStatus>

发出了两个 Ajax 请求,但 ajaxStatus 仅显示第一个的 gif 图像。

第一个请求:

form    form
form:agents_input   WindowsAD
form:accounts:3:j_...   form:accounts:3:j_idt71
form:accounts_sele...   
form:type_input WINDOWS
javax.faces.ViewState   e2s1
javax.faces.partial.ajax    true
javax.faces.partial.execute form:accounts:3:j_idt71
javax.faces.partial.render  accountsDialog
javax.faces.source  form:accounts:3:j_idt71

第二个请求:

accountsDialog  accountsDialog
accountsDialog_contentLoa...    true
form    form
form:agents_input   WindowsAD
form:accounts_sele...   
form:type_input WINDOWS
javax.faces.ViewState   e2s1
javax.faces.partial.ajax    true
javax.faces.partial.execute accountsDialog
javax.faces.partial.render  accountsDialog
javax.faces.source  accountsDialog

为什么 ajaxStatus 对第二个请求不起作用?我正在使用 PrimeFaces 3.4.2 和 JSF Mojarra 2.1.13。

4

2 回答 2

0

我的 <p:ajax> 请求之一目前面临类似问题。我发现ajax调用本身并不是通过PrimeFaces.ajax.AjaxRequest调用的。我也找到了同样的根本原因。当我们没有在 <p:ajax> 中设置 "async='true'" 时,它会将请求重定向到 RequestManager 以调用 ajax 调用。我在那里看到一个问题,offer 方法仅在 requests 数组长度为 1 时调用 ajax 调用,假设 requests 变量将始终被实例化,因此长度将为 1,但 requests 变量仍保留前一个第二次调用时的对象。这是因为浏览器存储 requests 变量并不断将新条目推入其中,或者 jQuery 正在处理它。因此,对于以后的第二个请求,它没有调用 ajax 调用。设置“async='true'”后,问题得到解决。提到版本,我的 PrimeFaces 是 1.1,而 jQuery 目前正在升级到 1.12.4,这就是问题所在。相同的代码片段在 jQuery 1.4.2 上运行良好。

if (b.async) {
    jQuery.ajax(d);
} else {
    PrimeFaces.ajax.RequestManager.offer(d);
}

PrimeFaces.ajax.RequestManager = {
    requests: new Array(),
    offer: function(a) {
        this.requests.push(a);
        if (this.requests.length == 1) {
            var b = jQuery.ajax(a);
            if (b === false) {
                this.poll()
            }
        }
    }
}
于 2019-01-15T07:53:11.743 回答
0

我有同样的问题。在 ajax 操作后更新组件后,p:ajaxstatus 不再起作用。

这对我有用:

只需将 p:ajaxstatus-id 添加到更新列表中:

<p:ajaxStatus id="aj">...</p:ajaxStatus>

<h:form>
    <p:commandButton ... update=":aj">...</p:commandButton>
</h:form>

现在它再次工作,似乎 ajaxStatus 需要了解“更新”组件才能再次注册它们(用于监视第二个、第三个...... ajax 请求)。

于 2016-04-02T16:02:48.240 回答