如何使用Primefaces发送ajax回调参数?

时间:2012-11-06 23:56:42

标签: jsf primefaces

我尝试使用RequestContext发送Ajax回调,但我无法让它工作。

我尝试了Primefaces login demo,但是" args.loggedIn"在javascript函数中始终是未定义的,而" args"是一个对象。

这是我的代码:

dialogLogin.xhtml:

<h:body>
<h:outputLink
        id="loginLink" 
        value="javascript:void(0)" 
        onclick="dlg.show()"
        title="login">
        Click
</h:outputLink>

<p:dialog id="dialog" header="Login" widgetVar="dlg">  
    <h:form>  

        <h:panelGrid columns="2" cellpadding="5">  
            <h:outputLabel for="username" value="Username:" />  
            <p:inputText value="#{logBean.username}"   
                    id="username" required="true" label="username" />  

            <h:outputLabel for="password" value="Password:" />  
            <h:inputSecret value="#{logBean.password}"   
                    id="password" required="true" label="password" />  

            <f:facet name="footer">  
                <p:commandButton id="loginButton" value="Login" update=""   
                    actionListener="#{logBean.login}"   
                    oncomplete="handleLoginRequest(xhr, status, args)"/>  
            </f:facet>  
        </h:panelGrid>  

    </h:form>  
</p:dialog>  

<script type="text/javascript">  
    function handleLoginRequest(xhr, status, args) {  
        if(args.validationFailed || !args.loggedIn) {  
            jQuery('#dialog').effect("shake", { times:3 }, 100);  
        } else {  
            dlg.hide();  
            jQuery('#loginLink').fadeOut();  
        }  
    }  
</script>
</h:body>

LogBean.java:

@ManagedBean
public class LogBean {  

    private String username;      
    private String password;  

    // getters & setters

    public void login(ActionEvent actionEvent) {  
        RequestContext context = RequestContext.getCurrentInstance();  
        boolean loggedIn = false;  

        if(username != null  && username.equals("admin") && password != null  && password.equals("admin")) {  
            loggedIn = true;  
        } else {  
            loggedIn = false;  
        }  
        System.out.println("loggedIn : " + loggedIn);
        context.addCallbackParam("loggedIn", loggedIn);  
    }
}  

javascript函数&#34; handleLoginRequest&#34;被称为,但&#34; args.loggedIn&#34;总是未定义的。我不明白为什么......

发送的响应(我从Firebug获得)是:

<?xml version="1.0" encoding="utf-8"?>
<partial-response>
    <changes>
        <update id="javax.faces.ViewState">
            <![CDATA[3585116548358262356:-8608378680794066522]]>
        </update>
    </changes>
</partial-response>

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

如果验证失败,您将从应用程序获得以下响应:

<extension ln="primefaces" type="args">{"validationFailed":true}</extension>

,其中包含仅包含 validationFailed : true的JSON响应。响应中没有loggedIn字段,这就是undefined您拨打args.loggedIn的原因。

如果验证通过但登录失败,您将收到以下响应:

<extension ln="primefaces" type="args">{"loggedIn":false}</extension>

此回复的值为loggedIn,因此调用args.loggedIn会产生false。由于JSON响应中没有validationFailed,因此调用args.validationFailed会导致未定义。