2010-11-17 9 views
5

Я экспортирует метод GWT в родной JavaScript следующим образом:Выяснить, когда модуль GWT загружен

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

На странице хозяина, я пытаюсь вызвать его:

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

К сожалению, при вызове обратного вызова document.ready функция еще не определена. При ручном запуске с консоли Firebug функция работает нормально.

Я мог выполнять несколько опросов каждые 50 миллисекунд, пока не найду определенную функцию под этим именем, но это похоже на ужасный подход.

Как я могу получить уведомление, когда модуль загружен и, следовательно, когда функция доступна?

ответ

12

Я попытался бы определить функцию обратного вызова в главной странице и вызвать ее из GWT в конце метода onModuleLoad().

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

Спасибо, выглядит интересно - особенно бит DeferredCommand. Сегодня я сделаю этот снимок. –

+2

BTW, с GWT 2.1 вы должны использовать Scheduler(). Get(). ScheduleDeferred() –

+0

Спасибо за подсказку планировщика. – vanje

Смежные вопросы