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

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

Я знаю, что для этого есть API-оболочка GWT, но у него нет необходимых мне функций. Я выполнил все предложения здесь: использовать 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?


person Zip184    schedule 03.09.2013    source источник
comment
Может оказаться полезным серия исключений при работе с API визуализации GWT. $ wnd.google undefined   -  person Suresh Atta    schedule 03.09.2013


Ответы (2)


Вместо добавления этого тега скрипта на вашу хост-страницу вы можете использовать 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.

person Răzvan Petruescu    schedule 04.09.2013
comment
Я просто попытался вынуть строку из заголовочного файла и использовать это решение (я был ленив). Прежде чем добавить этот код, я хотел воспроизвести ошибку javascript. Я понял, что больше не могу. Итак, у меня он не работает ни с этим инжектором сценария, ни со строкой в ​​моем заголовке HTML. Я знаю, что раньше это не работало. У меня все еще есть AjaxLoader.loadApi. Что с этим? Мне нужно очистить кеш браузера или что-то в этом роде? - person Zip184; 27.09.2013
comment
Я не могу вам с этим помочь (я не понимаю, что случилось), но могу попытаться проверить переменные во время выполнения браузера (я использую Chrome 'Inspect Element'), что должно дать вам представление о том, что происходит, а также помог мне отладить множество проблем. Дополнительный пример см. В bitbucket.org/p7u-public/myvdm/src/master/myvdm-web/src/main/ - person Răzvan Petruescu; 07.01.2021

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

<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, но у меня это работает.

person Zip184    schedule 03.09.2013