我在这里有一些原生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=???...
答案 0 :(得分:1)
JsInterop假设它所推理的代码存在于主窗口中 - 这不是命名空间的区别,而是它运行的不同全局上下文(具有不同的Object,Array类型等)。在Java术语中,您可能会认为这不仅仅是“错误的包”,而是“错误的类加载器”,尽管这种方式不能很好地纠正。
相反,指示ScriptInjector将您创建的JS放入主页面,然后您可以直接与"<window>"
进行交互:
train
或者,您可以使用# Install a Drive FUSE wrapper.
# https://github.com/astrada/google-drive-ocamlfuse
的“魔术”字符串,这意味着“根本不提供任何名称空间”。这不是JsInterop的官方部分(常量不是在jsinterop注释本身中声明的),但至少目前是一种可以解决这个问题的方法。