我在这里有一些本地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();
}


问题在于,名称为JsPackage.GLOBAL的名称不正确。注入的代码不在全局命名空间下,而是由GWT生成的代码,并且大概位于GWT iframe内部。我需要什么名称空间?

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

...namespace=???...

最佳答案

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

而是直接指示ScriptInjector将创建的JS放入主页,然后可以直接使用setWindow与之交互:

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


另外,您可以使用"<window>"的“魔术”字符串,这表示“根本不提供任何名称空间”。这不是JsInterop的正式部分(常量未在jsinterop批注本身中声明),但是至少目前是解决此问题的一种方法。

09-12 11:43