我们可以在 GWT 中使用这个 $entry 方法来允许外部 javascript 执行 java 方法。
你可以看看他们文档中的解释https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#calling 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() {
[email protected] /cdn-cgi/l/email-protection::refreshModuleJava();
alert('test');
});
}-*/;
public void refreshModuleJava() {
logger.log(Level.WARNING, "REFRESH");
}
我觉得很有趣的是,警报被调用,我在浏览器中看到结果,但之前的调用没有执行。
你知道是否真的可以做这样的事情吗?
$entry
不是关于调用java,这是为了确保 GWT 中的一些事情顺利进行:异常被路由到GWT.UncaughtExceptionHandler
,以及预定的命令via Scheduler#scheduleEntry
and Scheduler#scheduleFinally
被正确调用。
你的问题是this
。当函数被调用时,this
不是你的MyModule
类(很可能是$wnd
目的)。这就是为什么您链接到的问题使用var that = this
。是关于scoping.
你还需要实际call方法,不仅仅是引用它:在 JSNI 中,第一对括号用于形式参数(以消除重载的歧义),并且您需要另一对传递实际参数:[email protected] /cdn-cgi/l/email-protection::refreshModuleJava()()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)