Piszę aplikację w GWT (mapfaire.com), która korzysta z interfejsu Google Maps API i chciałbym użyć utilities library. Napisanie opakowania JSNI dla bibliotek nie stanowi problemu, ale w jaki sposób mogę zagwarantować, że kompilator "zapali" JS w samej aplikacji, zamiast pobierać je osobno przez module script include?Wiązanie kodu Javascript do aplikacji GWT
Odpowiedz
W GWT 2.4 dodaje ScriptInjector http://gwt-code-reviews.appspot.com/1451818/
ScriptInjector.fromUrl("http://example.com/foo.js").setCallback(
new Callback<Void, Exception>() {
public void onFailure(Exception reason) {
Window.alert("Script load failed.");
}
public void onSuccess(Void result) {
Window.alert("Script load success.");
}
}).inject();
Jeśli licencja na to pozwala, możesz skopiować i wkleić cały kod JS biblioteki w metodę JSNI.
Można również użyć TextResource takiego:
public static interface Resources extends ClientBundle {
@Source("some.js")
TextResource someJs();
}
public void onModuleLoad() {
final Resources resources = GWT.create(Resources.class);
eval(resources.someJs().getText());
}
private static native void eval(String s) /*-{
eval(s);
}-*/;
tekście „some.js” zostanie internowany bezpośrednio do otrzymanego wniosku. Nie będzie żadnego osobnego pobierania.
Tak, mogłem, ale naprawdę chcę coś szczuplejsze. Możliwe, że pliki zostały przeniesione podczas kompilacji jako zależność. –
@Sudhir: W pełni to rozumiem. Jednak gwtc to tylko kompilator/konwerter Java do JavaScript, który może dodatkowo zawierać JavaScript przez JSNI. Więc nie widzę bezpośredniego sposobu. Może możesz zbudować rozwiązanie pośrednie w ten sposób: Dodaj kod JS jako TextResource (ClientBundle), a następnie oceń tekst w JSNI. Jeszcze tego nie próbowałem! –
W tej chwili może oznaczyć plik js jako zasób skryptu i upewnić się, że został pobrany przed uruchomieniem modułu. Próbuję sprawdzić, czy ktokolwiek zna sposób, w jaki mogę powiedzieć GWT, aby umieścić ten plik w samym module. Wciąż robiłoby dokładnie to samo, z mniejszą liczbą próśb. –
Czy urządzenie gwt-maps-utility project jest przydatne do Twoich potrzeb?
Nie, jestem na v3 i nikt nie wydaje się mieć portu GWT narzędzi dla v3 jeszcze :( –
Można zdefiniować ClientBundle do zasobów JavaScript tak:
public interface JsResources extends ClientBundle {
final JsResources INSTANCE = GWT.create(JsResources.class);
@Source("myAwesomeJavaScript.js")
TextResource myAwesomeJavaScript();
}
i umieścić go w swojej aplikacji z ScriptInjector:
ScriptInjector
.fromString(JsResources.INSTANCE.myAwesomeJavaScript().getText())
.inject();
imo to jest najlepsze rozwiązanie, łącząc js w źródło tekstowe zmniejszy dodatkowe żądanie http, aby załadować js. –
Whoa. Wygląda na to, że przeszła długą drogę od 1.6: D –