1

RequestContextを使用してAjaxコールバックを送信しようとしていますが、機能しません。

Primefacesのログインデモを試しましたが、javascript関数の「args.loggedIn」は常に未定義ですが、「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関数「handleLoginRequest」が呼び出されますが、「args.loggedIn」は常に未定義です。理由がわからない...

送信された応答(Firebugから取得)は次のとおりです。

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

どんな助けでも大歓迎です!

4

1 に答える 1

1

検証が失敗した場合、アプリケーションから次の応答が返されます。

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

これには、のみ を含むJSON応答が含まれますvalidationFailed : true。応答にフィールドがありません。これが、あなたが呼び出すloggedIn理由です。undefinedargs.loggedIn

検証に合格してもログインに失敗した場合は、次の応答が返されます。

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

この応答にはloggedIn値があるため、を呼び出すとargs.loggedIn結果がになりfalseます。validationFailedJSON応答には存在しないため、呼び出しargs.validationFailed結果は未定義になります。

于 2012-11-07T18:35:47.773 に答える