JSNI: $ wnd.google.maps.LatLng не является конструктором - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь использовать Google Maps от JSNI, следующий фрагмент кода выдает исключение:

com.google.gwt.core.client.JavaScriptException: (TypeError): $ wnd.google.maps.LatLngне является конструктором в com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript (BrowserChannelServer.java:248) .....

Может ли кто-нибудь помочь мне указать, что здесь не так?

@Override
public void init(final Point center, final int zl)
{
    ScriptInjector
            .fromUrl(   "http://maps.googleapis.com/maps/api/js?sensor=false&language="
                                + Cookies.getCookie(LocaleInfo.getLocaleCookieName()))
            .setWindow(ScriptInjector.TOP_WINDOW).setCallback(new Callback<Void, Exception>()
            {
                public void onFailure(Exception reason)
                {
                    // I18N
                    Window.alert("load google maps api failed,all map function will not work.");
                }

                public void onSuccess(Void result)
                {
                    map = initMap(getElement(), center.getLatitude(), center.getLongitude(), zoomLevel = zl);
                }
            }).inject();
}

native JavaScriptObject initMap(Element canvas, double latitude, double longitude, int zoomLevel) /*-{
    return new $wnd.google.maps.Map(canvas, {
        zoom : zoomLevel,
        center : new $wnd.google.maps.LatLng(latitude, longitude),
        mapTypeId : $wnd.google.maps.MapTypeId.ROADMAP
    });
}-*/;

Ответы [ 2 ]

0 голосов
/ 31 июля 2015

MAP API внедряет другую библиотеку JavaScript после загрузки первой.

Для загрузки API карты после загрузки страницы Google предоставляет дополнительный параметр обратного вызова. Метод обратного вызова - это вызов после загрузки API.

Чтобы это сработало, вам нужно зарегистрировать метод GWT, который можно вызывать из внешнего блока javascript.

   public static native void exportStaticMethod() /*-{
    $wnd.mapInit = $entry(@com.my.test.client.MyProject::init());
   }-*/;

Исключите этот метод на вашем onModuleLoad, и он может быть исключен из внешнего java-скрипта следующим образом:

function initialize()
{
        window.mapInit();
}

Чего не хватает, так это внедрения API карты в ваш код GWT:

ScriptElement element = Document.get().createScriptElement();
    element.setLang("javascript");
    element.setType("text/javascript");
    element.setSrc("https://maps.googleapis.com/maps/api/js?callback=initialize&sensor=false");
    Document.get().getElementsByTagName("head").getItem(0).appendChild(element);

После загрузки скрипта вызывается метод init.

private static void init()
{
    System.out.println("loaded");
}

См. Здесь Загрузка клиентских API

0 голосов
/ 08 февраля 2012

Можете ли вы попробовать передать третий необязательный логический параметр для noWrap?Возможно, вы столкнулись с какой-то ошибкой в ​​DevMode.Вы пытались запустить тот же код после развертывания приложения?

...