p:ajax发射两次

时间:2015-09-28 10:57:12

标签: ajax jsf primefaces

关于p:PrimeFaces的ajax。我的<p:commandButton>中有两个p:ajax请求。我在第二种方法中做了stdout,以便我可以看到它是否被触发。相同(最后)的方法被触发两次,我不知道为什么。如果我只将一个<p:ajax>请求放入我的按钮,则会触发一次,如果我发出两个<p:ajax>请求,则会触发两次。

<h:body style="background:#f5f5f5;">
    <h:form id="formG">
        <p:commandButton styleClass="viewButton" icon="ui-icon-search"
            value="#{msg['button.open']}" id="auftragButtonG">

            <p:ajax listener="#{auftragBean.saveIdIntoAppScope()}"  partialSubmit="true"/>
            <p:ajax listener="#{auftragBean.loadXMLData()}" partialSubmit="true"/>
        </p:commandButton>
    </h:form>
</h:body>
public void loadXMLData(){
    setXmlData(entireXmlData(mandantId(), getJobId()));
    System.out.println(getXmlData().size());
}

有人知道为什么以及如何忽略第二次加载?

1 个答案:

答案 0 :(得分:3)

这是因为您指示组件在同一(默认)事件上触发两个ajax请求。一个<p:ajax>计为一个请求。换句话说,代码的行为与您编程的完全相同。

您需要以不同方式解决您的具体问题。

  1. 调用一个方法,然后委托给所需的方法。

    <p:commandButton ... action="#{bean.methodWhichInvokesBothMethods()}" partialSubmit="true" />
    
  2. 在一次调用中调用多个方法。您可以使用<f:actionListener binding>技巧。

    <p:commandButton ... partialSubmit="true">
        <f:actionListener binding="#{bean.method1()}" />
        <f:actionListener binding="#{bean.method2()}" />
    </p:commandButton>
    
  3. 无论哪种方式,<p:ajax>完全没必要,因为<p:commandButton>本身已经内置了ajax支持。

    另见: