Загрузка Google jsapi в приложение GWT

Я пытаюсь использовать JavaScript API Google в своем приложении GWT (для использования визуализаций Google), и у меня возникают проблемы со ссылкой на объект Google в моем JSNI. Я получаю ошибку JavaScript: "Google не определен".

Я знаю, что для этого есть GWT-оболочка API, но она не обладает необходимой мне функциональностью. Я следовал всем советам здесь: используйте API визуализации Google в GWT, но я все еще получаю эту ошибку.

Я добавил эту строку в мой файл gwt.xml:

<script src="https://www.google.com/jsapi"></script>

Я не уверен, где его поставить, поэтому я добавил его под своим основным тегом. Тот другой вопрос стека сказал добавить его, чтобы добавить его в мой HTML, так что я предполагаю, что это то, что они имели в виду.

Вот упрощенный нативный метод, который я вызываю и который выдает ошибку "Google не определен":

public static native void nativeJavaScriptFunction() /*-{
    google.load('visualization', '1.0', {
        'packages' : [ 'corechart' ]
    });
}-*/;

Я также пытался ссылаться на Google как "$wnd.google" и "$doc.google". Я использую последнюю версию GWT 2.5.1. У кого-нибудь еще есть работающий javascript api, на который ссылается метод JSNI?

2 ответа

Решение

Я нашел решение. Прежде всего, я не хотел добавлять этот тег сценария в файл gwt.xml. Я не знал, что у моего приложения был основной файл HTML. Я добавил это к тегу head там.

<script type="text/javascript" src="https://www.google.com/jsapi" ></script>

Затем я мог бы ссылаться на объект Google в JNSI через $wnd.google. У меня все еще были проблемы с фактическим вызовом загрузки, хотя. Это заставляло страницу очищаться и просто зависать. Я решил попробовать загрузить API с этим кодом, который я извлек из VisualationUtils из API-оболочки GWT.

AjaxLoaderOptions options = AjaxLoaderOptions.newInstance();
options.setPackages("corechart");
AjaxLoader.loadApi("visualization", "1", new Runnable() {
    @Override
    public void run() {
        jsniCall();
}

Это добилось цели. Я все еще хотел бы знать, почему я не могу загрузить API в методе JSNI, но это работает для меня.

Вместо добавления этого тега скрипта на страницу вашего хоста вы можете использовать ScriptInjector, например так:

ScriptInjector.fromUrl("http://api.elsevier.com/javascript/scopussearch.jsp").setCallback(new Callback<Void, Exception>() {
        @Override
        public void onFailure(Exception reason) {
            throw new UnsupportedOperationException("FAILURE to inject Scopus API !!!");
        }

        @Override
        public void onSuccess(Void result) {
            System.out.println("Elsevier scopus search API successfully injected...");
        }
    }).setWindow(ScriptInjector.TOP_WINDOW).inject();

Тогда вы сможете успешно использовать внедренный API через JSNI.

Другие вопросы по тегам