Загрузка 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.