在我的第一个GWT模块中,我想存储一个JavaScript对象,稍后我想在第二个GWT模块中接收这个对象。 一切都适用于原始类型,但我的复杂类型将始终将所有字段设置为“未定义”。
我的班级,我想从一个模块转移到另一个模块:
public class SomeThing {
public Set<String> strings = new HashSet<String>();
}
我的第一个模块的入口点如下:
public class EntryA implements EntryPoint {
@Override
public void onModuleLoad() {
// define test data
SomeThing someThing = new SomeThing();
someThing.strings.add("hallo123");
// save data to JavaScript
saveToJavaScript(someThing);
// read and show saved data
Window.alert("ModuleA:"+readFromJavaScript());
Window.alert("ModuleA strings:"+readFromJavaScript().strings);
}
private native void saveToJavaScript(SomeThing thing) /*-{
$wnd.storedThing = thing;
}-*/;
private native SomeThing readFromJavaScript() /*-{
return $wnd.storedThing;
}-*/;
}
我的第二个模块的入口点如下:
public class EntryB implements EntryPoint {
@Override
public void onModuleLoad() {
// run delayed, so that ModuleA will be executed first
new Timer() {
@Override
public void run() {
// read and show saved data
Window.alert("ModuleB:"+readFromJavaScript());
Window.alert("ModuleB strings:"+readFromJavaScript().strings);
}
}.schedule(5000);
}
private native SomeThing readFromJavaScript() /*-{
return $wnd.storedThing;
}-*/;
}
我正在分别编译每个模块。两个生成的JavaScript文件都包含在一个html文件中。
输出结果为:
ModuleA:moduleA.client.SomeThing@a
ModuleA strings:[hallo123]
ModuleB:moduleA.client.SomeThing@a
ModuleB strings:undefined
有没有人知道如何存储这种复杂的类型?如果您需要更多信息,请与我们联系。
更新
我发现,如果我“刷新”JavaScript中的字段,它确实有效。我不知道为什么会有效!
private native SomeThing readFromJavaScript() /*-{
var a = $wnd.storedThing;
a.@moduleA.client.SomeThing::strings = a['moduleA_client_SomeThing_strings'];
return $wnd.storedThing;
}-*/;
尽管如此,我需要一种通用方法,它允许传输任何对象 - 我不想提及所有可能的字段...... :(
答案 0 :(得分:1)
这可能与模块的加载方式有关。
加载多个模块的首选方法如下所述:Loading multiple modules in an HTML host page:
If you have multiple GWT modules in your application, there are two ways to
approach loading them.
1. Compile each module separately and include each module with a separate
<script> tag in your HTML host page.
2. Create a top level module XML definition that includes all the modules you
want to include. Compile the top level module to create a single set of
JavaScript output.
...[cut for brevity] The second approach is strongly recommended.
答案 1 :(得分:0)
您无法读取GWT模块之间的字段的原因是每个模块都是独立编译和混淆的。这意味着SomeThing.strings
可以映射到一个模块中的.a
和另一个模块中的`.q'。您的“刷新”技巧仅适用,因为在详细模式下编译模块通常会产生相同的名称。
您可能需要考虑使用AutoBeans框架,该框架支持以稳定的方式对对象进行JSON编码。