p:ajaxStatus不适用于第二个请求

时间:2013-05-21 08:47:16

标签: ajax jsf jsf-2 primefaces

在显示编辑对话框之前,使用加载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。

2 个答案:

答案 0 :(得分:0)

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

这对我有用:

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

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

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

现在它再次起作用,似乎ajaxStatus需要知道&#34;更新&#34;再次注册它们的组件(用于监视第二,第三...... ajax请求)。

答案 1 :(得分:0)

我的请求之一目前正面临类似的问题。我发现ajax调用本身未通过PrimeFaces.ajax.AjaxRequest调用。我也找到了造成这种情况的根本原因。当我们没有在中设置“ async ='true'”时,它将请求重定向到RequestManager来调用ajax调用。我在这里看到一个问题,假设请求变量将始终被实例化,因此长度为1,但是request变量仍保留前一个变量,则offer方法仅在请求数组长度为1时才调用ajax调用。对象在第二次调用时。这是因为浏览器存储了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()
            }
        }
    }
}