GWT – 从外部javascript调用实例方法

我们可以在GWT中使用这个$entry方法来允许外部 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");
}

我觉得非常有趣的是调用了警报,我在浏览器中看到了结果,但是之前的调用没有被执行.

你知道它是否真的可以做这样的事情?

解决方法

$entry不是关于调用java,而是关于确保GWT中的一些事情顺利进行:异常被路由到GWT.UncaughtExceptionHandler,并且通过Scheduler#scheduleEntry和Scheduler#scheduleFinally调度的命令被正确调用.

你的问题是这个.调用函数时,这不是您的MyModule类(它最可能是$wnd对象).这就是你链接的问题使用var that = this.这是关于范围界定的.

你还需要实际调用方法,而不仅仅是引用它:在JSNI中,第一对parens用于形式参数(消除歧义的歧义),你需要另一对传递实际参数:.@ mypackage.MyModule: :refreshModuleJava()().

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...