GWT和JSInterop命名空间

问题描述 投票:0回答:1

我在这里有一些原生的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=???...
javascript java gwt
1个回答
1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.