GWT - 从调用外部JavaScript实例方法(GWT - Calling instance

2019-08-17 08:49发布

还有就是可以在GWT使用允许外部JavaScript执行Java方法这个$输入方法。 你可以看到他们的文档中解释https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#calling

然而,该示例中,只有静态方法。 我试图写一个非静态方法,当我尝试调用它,我得到一个异常:

java.lang.ClassCastException: Cannot cast com.google.gwt.core.client.JavaScriptObject$ to mypackage.MyModule

这里是我的代码:

public native void setRefreshModuleCallback() /*-{
    $wnd.refreshModule = $entry(function() {
        this.@mypackage.MyModule::refreshModuleJava();
        alert('test');
    });
}-*/;

public void refreshModuleJava() {
    logger.log(Level.WARNING, "REFRESH");
}

我觉得很搞笑的是,警报被调用时,我看到在浏览器中的结果,但电话之前不被执行。

你知道,如果它实际上可以做这样的事情?

Answer 1:

$entry是不是调用Java,它是关于确保几件事GWT顺利:异常被路由到GWT.UncaughtExceptionHandler ,并通过调度命令Scheduler#scheduleEntryScheduler#scheduleFinally正确调用。

你的问题是this 。 当函数被调用, this是不是你的MyModule类(这是最有可能的$wnd对象)。 这就是为什么你链接的问题使用var that = this 。 这是关于作用域

您还需要实际调用该方法,不仅引用它:在JSNI,第一对括号的是形式参数(消除歧义过载),你需要另一对传递的实际参数: that.@mypackage.MyModule::refreshModuleJava()()



文章来源: GWT - Calling instance method from external javascript
标签: gwt jsni