GWT 和 JSInterop 命名空间
GWT and JSInterop namespace
我这里有一些原生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 class:
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="MyDialog")
public class MyDialog
{
public static native void foo();
}
问题是 namesoace JsPackage.GLOBAL 不准确。注入的代码不在全局命名空间下,而是由 GWT 生成的代码,我相信可能在 GWT iframe 中。我需要什么命名空间?
换句话说,这应该是什么:
...namespace=???...
JsInterop 假设它正在推理的代码存在于主 window - 这不是命名空间的区别,而是它运行的不同全局上下文(具有不同的对象、数组类型) , ETC)。在 Java 术语中,您可能认为这不仅是 "wrong package",而且是 "wrong classloader",尽管在某种程度上您无法很好地纠正。
相反,直接将 ScriptInjector 将您创建的 JS 放入主页面,您可以直接与它交互 setWindow
:
ScriptInjector.fromUrl(...)
.setWindow(ScriptInjector.TOP_WINDOW)
.setCallback(...);
或者,您可以使用 "<window>"
的 "magic" 字符串,这将表示 "don't provide any namespace at all"。这不是 JsInterop 的官方部分(常量未在 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 class:
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="MyDialog")
public class MyDialog
{
public static native void foo();
}
问题是 namesoace JsPackage.GLOBAL 不准确。注入的代码不在全局命名空间下,而是由 GWT 生成的代码,我相信可能在 GWT iframe 中。我需要什么命名空间?
换句话说,这应该是什么:
...namespace=???...
JsInterop 假设它正在推理的代码存在于主 window - 这不是命名空间的区别,而是它运行的不同全局上下文(具有不同的对象、数组类型) , ETC)。在 Java 术语中,您可能认为这不仅是 "wrong package",而且是 "wrong classloader",尽管在某种程度上您无法很好地纠正。
相反,直接将 ScriptInjector 将您创建的 JS 放入主页面,您可以直接与它交互 setWindow
:
ScriptInjector.fromUrl(...)
.setWindow(ScriptInjector.TOP_WINDOW)
.setCallback(...);
或者,您可以使用 "<window>"
的 "magic" 字符串,这将表示 "don't provide any namespace at all"。这不是 JsInterop 的官方部分(常量未在 jsinterop 注释本身中声明),但至少目前是您可以解决此问题的一种方法。