gwt-google-apis gwt-map-3.8.0-pre throws JavaScriptException'map'未定义

时间:2012-09-19 06:58:35

标签: javascript google-maps gwt google-maps-api-3

我认为这是谷歌地图的GWT绑定的地图3.8.0的预发布中的一个错误,但在我沿着那条路走下去之前我想我会跟你们一起检查。当我创建一个地图,然后尝试将新创建的地图面板/小部件添加到包含的面板中时,我得到一个例外。如果我在包含现有html div的面板中创建地图,它会毫无例外地显示,但是如果它在HTML中有div或者没有,那么如果我尝试将它添加到任何其他面板,它会抛出异常。

它通常抛出的异常是:

gwt-google-apis gwt-map-3.8.0-pre throws JavaScriptException 'map' is not defined.

我还有其他例外情况,但是现在让我们忽略它们,除非它们变得相关。

这是我获得图书馆的链接: http://code.google.com/p/gwt-google-apis/downloads/detail?name=gwt-maps-3.8.0-pre1.zip&can=2&q=

顺便说一下,我用java 1.5编译器重新编译了原始源代码,但我没有改变任何东西。

作为背景,我正在将为Google地图v2编写的应用程序移植到v3。在当前的生产版本中,MapWidget对象被添加到VerticalPanel(即html表)中,它被加载到另一个VerticalPanel中,最终通过门户网站提供服务。如果我必须改变这种结构,那将是一次更广泛的重写,所以我很感激你能提供的任何见解。

我尝试了很多关于主题的变体,结果相似。很多时候地图会显示出来,但会显示为灰色,然后如果您通过控件与地图进行交互,它通常会自行排序,有时则不会。如果它是IE-8或firefox似乎并不重要。

我的代码如下所示:

    LatLng myLatLng = LatLng.create(39.571993, -104.998184);
    MapOptions myOptions = MapOptions.create();
    myOptions.setZoom(16.5);
    myOptions.setCenter(myLatLng);
    myOptions.setMapTypeId(MapTypeId.SATELLITE);
    //com.google.gwt.dom.client.Element mapDiv = Document.get().getElementById("map_canvas");
    RootPanel root = RootPanel.get("MAP1_NetworkMapContainer");
    //HTMLPanel mapPanel = HTMLPanel.wrap(mapDiv);
    //mapPanel.setHeight("100%");
    //map = GoogleMap.create(mapPanel.getElement(), options);

    try {
        root.add(mapPanel);
    } catch (Exception e) {
        Log.error("Received Exception ", e);
        String  error = e.toString();
    }

...作为一个小部件AKA,它在3.0.2的源代码中完成。

public class MapWidget extends Widget {
    final private static String EXCEPTION_NOT_ATTACHED
        = "Map widget must be attached to window's document.";
    private GoogleMap map;

    public MapWidget(MapOptions options) {
      setElement(Document.get().createDivElement());
      map = GoogleMap.create(getElement(), options);
    }

...作为SimplePanel的扩展

public class MapPanel extends SimplePanel {
    final private static String EXCEPTION_NOT_ATTACHED
        = "Map Panel must be attached to window's document.";
    private GoogleMap map;

    public MapPanel(MapOptions options) {
      map = GoogleMap.create(getElement(), options);
    }

结果总是一样的。如果我的GWT小部件在HTML中具有div的元素id,则显示OK,但是如果我尝试添加创建的div或html div的结果然后将其附加到根面板,则会抛出异常。如果它是根面板或任何其他类型的面板似乎并不重要。我将mapPanel添加到。

2 个答案:

答案 0 :(得分:1)

我已经开始使用这个库了:对于我的工作,它有效。

我是这样做的:

public class MyMapWidget extends Composite {

  interface MyMapWidgetUiBinder
      extends UiBinder<Widget, MyMapWidget> {}

  private static MyMapWidgetUiBinder uiBinder = 
      GWT.create(MyMapWidgetUiBinder.class);

  @UiField FlowPanel mapContainer;   

  private GoogleMap map;  

  ...

  public MyMapWidget() {

       initWidget(uiBinder.createAndBindUi(this));

       MapOptions opts = MapOptions.create();

       opts.setScaleControl(true);
       // add your map options
  ...
       opts.setCenter(LatLng.create(44.1, 0.2);
       opts.setZoom(8.0);

       map = GoogleMap.create(mapContainer.getElement(), opts);

  ...
  }

在相应的UiBinder XML文件中我有

<g:FlowPanel ui:field="mapContainer" width="500px" height="350px" />

答案 1 :(得分:0)

我从来没有能够使用预发布1绑定。我切换到此处找到的第三方绑定:Google Maps V3

在这个问题已经萎缩的2。5年内,以及被迫离开v2的最后期限迫在眉睫,我怀疑GWT团队的解决方案即将到来。

我在GWT网站上创建了一个问题,您可能需要检查更新,或者如果这会影响您,请投票支持。 Issue 504