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