GWT-从外部javascript调用实例方法
我们可以在GWT中使用这个$entry方法来允许外部javascript执行java方法。 您可以在他们的文档中看到解释 然而,这里的示例仅限于静态方法。我试图为非静态方法编写它,当我试图调用它时,我得到一个异常:GWT-从外部javascript调用实例方法,gwt,jsni,Gwt,Jsni,我们可以在GWT中使用这个$entry方法来允许外部javascript执行java方法。 您可以在他们的文档中看到解释 然而,这里的示例仅限于静态方法。我试图为非静态方法编写它,当我试图调用它时,我得到一个异常: java.lang.ClassCastException: Cannot cast com.google.gwt.core.client.JavaScriptObject$ to mypackage.MyModule 这是我的密码: public native void setRe
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");
}
我发现非常有趣的是,警报被调用,我在浏览器中看到结果,但之前的调用没有执行
你知道是否真的可以这样做吗?
$entry
不是关于调用java,而是关于确保GWT中的一些事情进展顺利:异常被路由到GWT.UncaughtExceptionHandler
,正确调用通过Scheduler#scheduleEntry
和Scheduler#scheduleFinally
调度的命令
您的问题是这个。调用函数时,this
不是您的MyModule
类(很可能是$wnd
对象)。这就是为什么您链接的问题使用var=This
。这是关于范围界定的
您还需要实际调用该方法,而不仅仅是引用它:在JSNI中,第一对参数用于形式参数(以消除重载歧义),您需要另一对参数传递实际参数:that.@mypackage.MyModule::refreshModuleJava()()
注意,我看过这篇文章,它没有帮助(或者我错过了一些东西)我尝试了“var that=this;”并调用了“that”。@mypackage.MyModule::refreshModuleJava();”但仍然得到了相同的行为更新答案和其他信息,但是var that=this
至少应该会使错误消失。@ThomasBroyer详尽的解释。你救了我一天。