$ wnd.google.visualization未定义

zer*_*o_r 3 java gwt smartgwt

我目前正在构建一个基于SmartGWT的Web应用程序(使用Portlet布局).所以我有几个"Portlet",它基本上扩展了不同内容的GWT Window.现在我想要一个Portlet来显示Dygraphs.所以我创建了一个RPC服务实现,它返回一个JSON字符串(基于DataTable对象).

因为我无法直接序列化我使用的DataTable对象

String json = JsonRenderer.renderDataTable(data, true, true).toString();
Run Code Online (Sandbox Code Playgroud)

其中"data"的类型为DataTable.

现在,这个String被正确传递到我想要创建Dygraph的客户端.在这个帖子中,有人建议使用

public static native DataTable toDataTable(String json) 
/-{ return new $wnd.google.visualization.DataTable(eval("(" + json + ")")); }-/;
Run Code Online (Sandbox Code Playgroud)

如果我在GWT客户端代码中使用它,我会收到错误消息

com.google.gwt.core.client.JavaScriptException: (TypeError): $wnd.google.visualization is undefined
Run Code Online (Sandbox Code Playgroud)

我是否会错过可视化API的"导入"?我在哪里实例化它?

或者是否有另一种方法可以将JSON数据串放入Dygraph?我找不到任何例子......

谢谢你的提示!

Ümi*_*mit 6

我假设您已在模块的XML中包含了visualization.jar和可视化命名空间

<inherits name="com.google.gwt.visualization.Visualization"/>
Run Code Online (Sandbox Code Playgroud)

这将为您提供类.您可能已经这样做了,否则您将遇到编译器错误.

但是,您还必须包含来自google服务器的实际可视化javascript文件(visualization.jar只是一个包装器).这可以通过两种不同的方式完成:

1.)将其包含在主页中:

<script type="text/javascript">
        google.load("visualization", "1", {'packages' : ["corechart"] });
</script>
Run Code Online (Sandbox Code Playgroud)

要么

2.)在您需要的地方动态加载它:

VisualizationUtils.loadVisualizationApi(onLoadCallback, MotionChart.PACKAGE);
Run Code Online (Sandbox Code Playgroud)

请参阅http://code.google.com/docreader/#p=gwt-google-apis&s=gwt-google-apis&t=VisualizationGettingStarted

顺便说一句.我已经分叉了Dygraphs项目,并将GWT包装器更改为更像其他可视化包装器.你可以在这里查看:https://github.com/timeu/dygraphs

编辑:我有一个新的GWT包装器用于dygraphs使用GWT 2.8的新JsInterop:https://github.com/timeu/dygraphs-gwt

注意:我更改了dygraphs中的一些行为,并添加了一些上游代码中没有的功能.