2010-11-17 16 views
5

ja eksportowania metody GWT do natywnego kodu JavaScript w następujący sposób:Dowiedzieć się, gdy moduł GWT załadowaniu

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); 
     }; 
    }-*/; 
} 

Na stronie gospodarza, staram się ją wywołać:

<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> 

Niestety, gdy wywoływany jest document.ready, funkcja nie jest jeszcze zdefiniowana. Po ręcznym uruchomieniu z konsoli Firebug funkcja działa dobrze.

Mogłabym wykonywać niektóre ankiety co 50 milisekund, dopóki nie znajdę zdefiniowanej funkcji o tej nazwie, ale wygląda to na okropne podejście.

Jak mogę otrzymać powiadomienie, gdy moduł zostanie załadowany, a zatem gdy funkcja będzie dostępna?

Odpowiedz

12

Chciałbym zdefiniować funkcję zwrotną na stronie hosta i wywołać ją z GWT na końcu metody onModuleLoad().

Hostpage funkcja:

<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

Dzięki, wygląda interesująco - zwłaszcza trochę DeferredCommand. Dam ci dzisiaj szansę. –

+2

BTW, z GWT 2.1 powinieneś używać Scheduler(). Get(). ScheduleDeferred() –

+0

Dzięki za podpowiedź harmonogramu. – vanje

Powiązane problemy