Averiguar si hay un módulo GWT ha cargado
Pregunta
Estoy exportando un método GWT a JavaScript nativo de la siguiente manera:
public class FaceBookGalleryEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
FacebookGallery facebookGallery = new FacebookGallery();
RootPanel.get().add(facebookGallery);
initLoadGallery(facebookGallery);
}
private native void initLoadGallery(FacebookGallery pl) /*-{
$wnd.loadGallery = function (galleryId) {
pl.@com.example.fbg.client.FacebookGallery::loadGallery(Ljava/lang/String;)(galleryId);
};
}-*/;
}
En la página de acogida, que estoy tratando de invocarlo:
<html>
<head>
<title>Facebook image gallery</title>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript" src="/fbg/fbg.nocache.js"></script>
<h1>Facebook gallery test</h1>
<script type="text/javascript">
$(document).ready(function() {
loadGallery('blargh');
});
</script>
</body>
</html>
Por desgracia, cuando se invoca la devolución de llamada document.ready, la función aún no está definido. Cuando se ejecuta manualmente desde el Firebug consolar a la función funciona bien.
Me podría realizar algún sondeo cada 50 milisegundos hasta que encuentre a una función definida por ese nombre, pero parece que un enfoque horrible.
¿Cómo puedo ser notificado cuando se carga el módulo y por lo tanto cuando la función está disponible?
Solución
I trataría de definir una función de devolución de llamada en el hostpage y llamarlo desde GWT al final del método onModuleLoad ().
Función Hostpage:
<script type="text/javascript">
function onGwtReady() {
loadGallery('blargh');
};
</script>
GWT:
public void onModuleLoad() {
FacebookGallery facebookGallery = new FacebookGallery();
RootPanel.get().add(facebookGallery);
initLoadGallery(facebookGallery);
// Using a deferred command ensures that notifyHostpage() is called after
// GWT initialisation is finished.
DeferredCommand.addCommand(new Command() {
public void execute() {
notifyHostpage();
}
}
private native void notifyHostpage() /*-{
$wnd.onGwtReady();
}-*/