将复杂的GWT类型存储为Javascript

时间:2011-03-10 09:32:40

标签: javascript gwt

在我的第一个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;
    }-*/;

尽管如此,我需要一种通用方法,它允许传输任何对象 - 我不想提及所有可能的字段...... :(

2 个答案:

答案 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编码。