Jsf 如何在JS中处理commandButton引发的错误消息';s动作

Jsf 如何在JS中处理commandButton引发的错误消息';s动作,jsf,jsf-2,primefaces,facelets,Jsf,Jsf 2,Primefaces,Facelets,在JSF2.1WEP应用程序中,我有一列包含commandButton的dataTable。commandButton触发的操作可能会引发错误我想在没有抛出错误的情况下打开一个对话框,或者在另一种情况下打开一个包含错误消息的框 JSF <h:form> <p:dataTable var="foo" value="#{myBean.foos}" > <p:column>#{foo.id}</p:column>

在JSF2.1WEP应用程序中,我有一列包含commandButton的dataTable。commandButton触发的操作可能会引发错误我想在没有抛出错误的情况下打开一个对话框,或者在另一种情况下打开一个包含错误消息的框

JSF

<h:form>
    <p:dataTable var="foo" value="#{myBean.foos}" >
        <p:column>#{foo.id}</p:column>
        <p:column>
            <p:commandButton title="Action" action="#{myBean.action()}" onComplete="handleResult(xhr, status, args)" >
                <f:setPropertyActionListener value="#{foo}" target="#{myBean.selectedFoo}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
</h:form>
MyBean

@ManagedBean
@ViewScoped
public class MyBean {
    private List<Foo> foos;
    private Foo selectedFoo;

    public void action() {
        try {
            // business logic
        } catch (Exception ex) {
            RequestContext rContext = RequestContext.getCurrentInstance();
            rContext.addCallbackParam("success", false);
            rContext.addCallbackParam("errorMsg", ex.getMessage());
        }
    }
}
@ManagedBean
@视域
公共类MyBean{
私人名单;
私人Foo选择Foo;
公共无效行动(){
试一试{
//业务逻辑
}捕获(例外情况除外){
RequestContext rContext=RequestContext.getCurrentInstance();
rContext.addCallbackParam(“成功”,false);
rContext.addCallbackParam(“errorMsg”,例如getMessage());
}
}
}
我能想到的唯一解决方案是使用PrimeFaces'
RequestContext.callBackParam()
,并编写一个JS函数来读取它并决定打开什么


有没有更顺畅的办法?如果可能的话,我会考虑使用验证的概念,但是我找不到一个如何拦截JS中错误的例子。

< p>规范的方式是只添加全局面消息(因此,使用<代码> null < /Cord>客户端ID)。 (调用
FacesContext#validationFailed()
将导致EL中的
{FacesContext.validationFailed}
计算
true
;这通常在
验证异常
的情况下设置)

然后,要仅显示全局消息框,只需使用

<p:messages globalOnly="true" autoUpdate="true" />

若要显示关于成功结果的对话框,请在执行以下操作时进行渲染:

<p:outputPanel autoUpdate="true">
    <p:dialog visible="true" rendered="#{facesContext.postback and not facesContext.validationFailed}">
        A successful postback is performed!
    </p:dialog>
</p:outputPanel>

已执行成功的回发!

如有必要,将一个或两个组件的
autoUpdate=“true”
替换为
update=“messagesId dialogPanelId”
,使其仅在按下特定按钮时触发。

不要用javascript思考,只需通过Ajax实现,并让服务器使用JSF函数即可。回答与往常一样出色。谢谢
<p:messages globalOnly="true" autoUpdate="true" />
<p:outputPanel autoUpdate="true">
    <p:dialog visible="true" rendered="#{facesContext.postback and not facesContext.validationFailed}">
        A successful postback is performed!
    </p:dialog>
</p:outputPanel>