1

我正在尝试在 GWT 应用程序中实现 Mozilla 的角色。这是我为测试它而设置的虚拟应用程序的部分代码:

public class OpenId implements EntryPoint {

private native void callWatch(String email)
/*-{
    $wnd.navigator.id.watch({
        loggedInUser: email,
        onlogin: function(assertion){
            $wnd.alert("Calling method");
            this.@com.gallup.openid.client.OpenId::processLogin(Ljava/lang/String;)(assertion);
            $wnd.alert("Called Java Method");
        },
        onlogout: function(){alert("Logged Out!");}
    });
}-*/;

private void processLogin(String assertion){
    Window.alert("Logged in!");
    personaStatus.setText("Log In Complete.");
}
}

当我调用该callWatch方法时,只显示“调用方法”警告框。其他任何一个都没有被调用过。因此,由于某种原因,代码似乎在第一个警报下方的 JSNI 调用处停止。但是在开发模式下没有错误。

我不明白为什么processLogin没有调用该方法。

我以为我正确地遵循了Google 的文档

我确实尝试过写作

this.@com.gallup.openid.client.OpenId::processLogin(Ljava/lang/String;)(assertion);

由于这篇文章。OpenID.@..._instance.@...

我不确定还能尝试什么。

4

1 回答 1

4

该变量this指向直接围绕它的函数,在本例中是您的 onlogin JavaScript 函数。您需要使用临时that变量(顺便说一下,这是一个典型的 JavaScript 习惯用法)

private native void callWatch(String email)
/*-{
  var that = this;
   ...
    onlogin: function(assertion){
      that.@com...

然后,理想情况下使用$entry(...), 如果您注册了 UncaughtExceptionHandler,您将看到错误消息。

另请参阅:https ://stackoverflow.com/a/5235580/291741

于 2012-11-10T01:20:45.597 回答