GWT和JSInterop命名空间

时间:2018-02-28 20:26:30

标签: javascript java gwt

我在这里有一些原生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=???...

1 个答案:

答案 0 :(得分:1)

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

相反,指示ScriptInjector将您创建的JS放入主页面,然后您可以直接与"<window>"进行交互:

train

或者,您可以使用# Install a Drive FUSE wrapper. # https://github.com/astrada/google-drive-ocamlfuse的“魔术”字符串,这意味着“根本不提供任何名称空间”。这不是JsInterop的官方部分(常量不是在jsinterop注释本身中声明的),但至少目前是一种可以解决这个问题的方法。