GWT和JSInterop命名空间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GWT和JSInterop命名空间相关的知识,希望对你有一定的参考价值。

我在这里有一些原生的JS测试代码(mydialog.js)

var MyDialog = {

    foo : function()
    {
        console.log("foo");
    }
};

我正在使用GWT使用以下代码注入:

ScriptInjector.fromUrl("mydialog.js").setCallback(new Callback<Void, Exception>()
{
    @Override
    public void onFailure(Exception reason)
    {
        Window.alert("Dialog Injection Failed!" + reason);
    }

    @Override
    public void onSuccess(Void result) {}

    }).inject();
}

然后,我在这里尝试建立一个JSInterop类:

@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="MyDialog")
public class MyDialog
{            
    public static native void foo();
}

问题是,namesoace JsPackage.GLOBAL不准确。注入的代码不在全局命名空间下,而是由GWT生成的代码,并且可能在我认为的GWT iframe内部。我需要什么命名空间?

换句话说,这应该是什么:

...namespace=???...
答案

JsInterop假定它所推理的代码存在于主窗口中 - 这不是命名空间的差异,而是它运行的不同全局上下文(具有不同的Object,Array类型等)。在Java术语中,您可能会认为这不仅仅是“错误的包”,而是“错误的类加载器”,尽管在某种程度上您无法很好地纠正。

相反,指示ScriptInjector将您创建的JS放入主页面,您可以直接使用setWindow与它进行交互:

ScriptInjector.fromUrl(...)
    .setWindow(ScriptInjector.TOP_WINDOW)
    .setCallback(...);

或者,您可以使用"<window>"的“magic”字符串,这意味着“根本不提供任何名称空间”。这不是JsInterop的官方部分(常量不是在jsinterop注释本身中声明的),但至少目前是一种可以解决这个问题的方法。

以上是关于GWT和JSInterop命名空间的主要内容,如果未能解决你的问题,请参考以下文章

无法通过GWT中的JsInterop将Java类导出到JavaScript

GWT FileUpload OnClick

GWT JsType数组转换

VSCODE 片段 PHP 自动填充命名空间

xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”

如何在C ++中将枚举导入不同的命名空间?