如何根据条件执行(或不执行)ajax 调用
how to execute (or not) an ajax call based on a condition
我需要使用 Ajax 执行调用,但首先,我还必须对支持 bean 的方法进行验证。根据此方法返回的布尔值,ajax 调用将被执行(返回 true)或不执行(例如返回 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;
}
}
仅当至少选择了 table 中的一项(列表 vendasAPagar
不为空)时才应显示该对话框。
不需要调用支持 bean 上的方法,但这会很方便,因为我可以向 <p:growl>
添加消息并向用户提供反馈(像这里: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 在这种情况下是如何工作的。提前致谢。
您可以启用已选择的按钮。现在的按钮只是一个没有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() }"/>
这就是我们所做的...
首先不要使用布尔值,使用 AJAX 和 JSF 对您有利。
如果不想显示对话框,可以在 JAVA 代码中标记 validationFailed。
public void abreDialogEfetuaPag () {
if (vendasAPagar == null || vendasAPagar.isEmpty()){
MensagensUtil.mensagemAviso("Atenção", "selecione ao menos uma venda");
FacesContext.getCurrentInstance().validationFailed();
}
}
让您的按钮仅在验证未失败时显示对话框。 PrimeFaces 在每个 AJAX 请求的 "args" 中返回该 validationFailed 标志的值。
<p:commandButton oncomplete="if (!args.validationFailed) PF('dialogConfirmarPagamento').show();" />
我需要使用 Ajax 执行调用,但首先,我还必须对支持 bean 的方法进行验证。根据此方法返回的布尔值,ajax 调用将被执行(返回 true)或不执行(例如返回 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;
}
}
仅当至少选择了 table 中的一项(列表 vendasAPagar
不为空)时才应显示该对话框。
不需要调用支持 bean 上的方法,但这会很方便,因为我可以向 <p:growl>
添加消息并向用户提供反馈(像这里: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 在这种情况下是如何工作的。提前致谢。
您可以启用已选择的按钮。现在的按钮只是一个没有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() }"/>
这就是我们所做的...
首先不要使用布尔值,使用 AJAX 和 JSF 对您有利。
如果不想显示对话框,可以在 JAVA 代码中标记 validationFailed。
public void abreDialogEfetuaPag () {
if (vendasAPagar == null || vendasAPagar.isEmpty()){
MensagensUtil.mensagemAviso("Atenção", "selecione ao menos uma venda");
FacesContext.getCurrentInstance().validationFailed();
}
}
让您的按钮仅在验证未失败时显示对话框。 PrimeFaces 在每个 AJAX 请求的 "args" 中返回该 validationFailed 标志的值。
<p:commandButton oncomplete="if (!args.validationFailed) PF('dialogConfirmarPagamento').show();" />