【问题标题】:GWT and JSInterop namespaceGWT 和 JSInterop 命名空间
【发布时间】:2018-02-28 20:26:29
【问题描述】:

我这里有一些原生 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】:

    JsInterop 假定它所推理的代码位于主窗口中——这不是命名空间的区别,而是它运行在不同的全局上下文(具有不同的对象、数组类型等)。在 Java 术语中,您可能会认为这不仅仅是“错误的包”,而是“错误的类加载器”,尽管您无法很好地纠正。

    相反,直接让 ScriptInjector 将你创建的 JS 放到主页面中,你可以直接与 setWindow 进行交互:

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

    或者,您可以使用"&lt;window&gt;" 的“魔术”字符串,这意味着“根本不提供任何命名空间”。这不是 JsInterop 的官方部分(该常量未在 jsinterop 注释本身中声明),但至少目前是您可以解决此问题的一种方式。

    【讨论】:

    • 好的,我认为它在这些方面发挥了作用。谢谢!
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多