【问题标题】:how to execute (or not) an ajax call based on a condition如何根据条件执行(或不执行)ajax 调用
【发布时间】:2018-12-25 20:07:12
【问题描述】:

我需要使用 Ajax 执行调用,但首先,我还必须对我的支持 bean 的方法进行验证。根据此方法返回的布尔值,将执行(返回 true)或不执行 ajax 调用(例如返回 false)。

为了更具体并举一个可触摸的示例,我试图在单击按钮后打开一个对话框。

这是我的 .xhtml 代码:

<h:form id="tableVendasNaoPagas">
    <p:dataTable value="#{relatorioVendaMB.vendasNaoPagas}" var="venda" rowKey="#{venda.codigo}" emptyMessage="Nenhuma venda encontrada" selection="#{relatorioVendaMB.vendasAPagar}">
    <f:facet name="header">Tabela de Venda</f:facet>
    <p:column selectionMode="multiple" style="width:16px;text-align:center"/>
    <p:column headerText="Código" sortBy="#{venda.codigo}">
        <h:outputText value="#{venda.codigo}"/>
    </p:column>
    <!--Other columns-->
    <f:facet name="footer">
        <p:commandButton id="btnAbreDialogEfetuarPagamento" value="Efetuar Pagamento" process="@form" update=":formConfirmarPagamento, :formAux:growlglobal, @this" oncomplete="if (#{relatorioVendaMB.abreDialogEfetuaPag()}) { PF('dialogConfirmarPagamento').show() }"/>
    </f:facet>
    </p:dataTable>
</h:form>
.
.
.
<h:form id="formConfirmarPagamento">
    <p:dialog id="dialogConfirmarPagamento" ...>
</h:form>

.java:

public boolean abreDialogEfetuaPag () {
    if (vendasAPagar == null || vendasAPagar.isEmpty()){
        MensagensUtil.mensagemAviso("Atenção", "selecione ao menos uma venda");
        return false;
    } else {
        return true;
    }
}

仅当至少选择了表中的一项时才应显示对话框(列表vendasAPagar 不为空)。
不需要调用 backing bean 上的方法,但这会很方便,因为我可以向 &lt;p:growl&gt; 添加一条消息并向用户提供反馈(如这里:MensagensUtil.mensagemAviso("Atenção", "selecione ao menos uma venda");

我尝试了许多不同的方法,但它们也没有奏效:

<p:commandButton id="btnAbreDialogEfetuarPagamento" value="Efetuar Pagamento">
    <p:ajax process="@form" update=":formConfirmarPagamento, :formAux:growlglobal" disabled="#{!relatorioVendaMB.abreDialogEfetuaPag()}" oncomplete="PF('dialogConfirmarPagamento').show()"/>
</p:commandButton>

<p:commandButton id="btnAbreDialogEfetuarPagamento" value="Efetuar Pagamento" process="@form" update=":formConfirmarPagamento, :formAux:growlglobal, @this" oncomplete="#{not empty relatorioVendaMB.abreDialogEfetuaPag()} ? PF('dialogConfirmarPagamento').show() : return false"/>

...还有很多其他的。在某些情况下,始终会显示对话框并且不会执行该方法,在其他情况下会执行该方法但永远不会显示对话框...

谁能给我一个提示,一个解决方案,如果可能的话,解释一下 Ajax 在这种情况下是如何工作的。提前致谢。

【问题讨论】:

    标签: ajax primefaces xhtml


    【解决方案1】:

    这就是我们所做的......

    首先不要使用布尔值,而是使用 AJAX 和 JSF。

    如果您不想显示对话框,可以在您的 JAVA 代码中标记验证失败。

    public void abreDialogEfetuaPag () {
        if (vendasAPagar == null || vendasAPagar.isEmpty()){
            MensagensUtil.mensagemAviso("Atenção", "selecione ao menos uma venda");
            FacesContext.getCurrentInstance().validationFailed();
        } 
    }
    

    让您的按钮仅在验证未失败时显示对话框。 PrimeFaces 在每个 AJAX 请求的“args”中交还该验证失败标志的值。

    <p:commandButton oncomplete="if (!args.validationFailed) PF('dialogConfirmarPagamento').show();" />
    

    【讨论】:

      【解决方案2】:

      您可以通过选择启用按钮。现在的按钮只是一个没有bean连接的点击按钮。

      <p:datatable....
        <p:ajax event="rowSelect" partialSubmit="true" process="@this" update="btnAbreDialogEfetuarPagamento" />
      
        <p:commandButton id="btnAbreDialogEfetuarPagamento" rendered="#{relatorioVendaMB.abreDialogEfetuaPag()}" value="Efetuar Pagamento" type="button" onclick="PF('dialogConfirmarPagamento').show() }"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-14
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        相关资源
        最近更新 更多