1

好吧,我有一个带有很多按钮的表单,当用户单击按钮时,必须在 ManagedBean 中执行某些方法,这是一个“疯狂”的逻辑。所以我有两个解决方案,我想知道你的建议:

第一个解决方案

<p:commandButton actionListener="#{myBean.someMethod}" value="Execute method 1" process="@this" />

public void someMethod(ActionEvent event){
 if (selectedCustomer){
  myCrazyLogicHere();
  RequestContext.getCurrentInstance().update("formAlternative:componentToUpdate");
  RequestContext.getCurrentInstance().execute("someAlternativeDialog.show()");
}else{
  addErrorMessage("Select a Customer before click on Method 1");
}
}

第二种解决方案

<p:commandButton actionListener="#{myBean.someMethod}" update=":formAlternative:componentToUpdate" oncomplete="someAlternativeDialog.show()" value="Execute Method 1" />

public void someMethod(ActionEvent event){
 if (selectedCustomer){
  myCrazyLogicHere();
}else{
  addErrorMessage("Select a Customer before click on Method 1");
}
}

所以,我在“第二个解决方案”中有一个问题。当 commandButton 完成您的循环时,它将执行“someAlternativeDialog.show()”,我需要为此设置一个条件,如果“selectedCustomer”为真,则显示对话框。在“第一个解决方案”中,这个问题已经解决了,因为我在 ManagedBean 中做所有事情,JSF 只是调用该方法。

所以,我的疑问是:最好的工作形式是什么?如果表格 2 更好,我该如何调节对话框显示?

4

1 回答 1

1

您不应该首先在操作方法中执行验证。您应该使用真正的验证器执行验证。例如,使用required="true"

<h:selectOneMenu value="#{myBean.selectedCustomer}" required="true" 
    requiredMessage="Select a Customer before click on Method 1">
    ...
</h:selectOneMenu>

当使用真验证器的验证失败时,JSF 已经不会调用命令按钮的操作。这样你就可以摆脱整个if-else块和addErrorMessage()行动方法。如果验证失败,PrimeFaces 将设置一个指标args对象,validationFailed其中包含您可以使用的属性oncomplete

<p:commandButton ... oncomplete="if (!args.validationFailed) someAlternativeDialog.show()" />
于 2013-09-13T13:05:16.287 回答