2010-11-17 7 views
5

Sono esportare un metodo GWT a JavaScript nativo, nel modo seguente:Scoprire quando un modulo GWT è stata caricata

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) { 
      [email protected]::loadGallery(Ljava/lang/String;)(galleryId); 
     }; 
    }-*/; 
} 

Nella pagina host, sto cercando di 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> 

Sfortunatamente, quando viene richiamato il callback document.ready, la funzione non è ancora definita. Quando viene eseguita manualmente dalla console Firebug, la funzione funziona perfettamente.

Potrei eseguire qualche polling ogni 50 millisecondi finché non trovo una funzione definita con quel nome, ma sembra un approccio orribile.

Come posso ricevere una notifica quando il modulo è caricato e quindi quando la funzione è disponibile?

risposta

12

Vorrei provare a definire una funzione di callback nella pagina host e chiamarla da GWT alla fine del metodo onModuleLoad().

funzione 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(); 
}-*/ 
+0

Grazie, sembra interessante - soprattutto il bit DeferredCommand. Darò questo un colpo stasera. –

+2

BTW, con GWT 2.1 si dovrebbe usare Scheduler(). Get(). ScheduleDeferred() –

+0

Grazie per il suggerimento Scheduler. – vanje