2013-03-07 7 views
6

Jest to metoda $ wejście, które możemy wykorzystać w GWT, aby umożliwić zewnętrzne javascript, aby wykonać metody Java. Możesz zobaczyć wyjaśnienia w ich dokumentacji https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#callingGWT - Wywołanie metody instancji z javascript zewnętrznych

Jednak przykład istnieje tylko statycznymi metodami. Staram się pisać dla metody non-statyczne i kiedy próbuję to nazwać, otrzymuję wyjątek:

java.lang.ClassCastException: Cannot cast com.google.gwt.core.client.JavaScriptObject$ to mypackage.MyModule 

Oto mój kod:

public native void setRefreshModuleCallback() /*-{ 
    $wnd.refreshModule = $entry(function() { 
     [email protected]::refreshModuleJava(); 
     alert('test'); 
    }); 
}-*/; 

public void refreshModuleJava() { 
    logger.log(Level.WARNING, "REFRESH"); 
} 

Co znajdę bardzo zabawny jest to powiadomienie, widzę wynik w przeglądarce, ale wywołanie tuż przed nim nie jest wykonywane.

Wiesz, czy to faktycznie możliwe do zrobienia czegoś takiego?

+0

Zauważ, że rzuciłem okiem na ten wpis i nie pomogło (lub coś przegapiłem) http://stackoverflow.com/questions/9676960/issue-with-calling-instance-method-from-handwritten- javascript –

Odpowiedz

10

$entry nie chodzi o nazywając java, chodzi o zapewnienie kilka rzeczy idą dobrze w GWT: wyjątki są kierowane do GWT.UncaughtExceptionHandler i polecenia zaplanowane poprzezScheduler#scheduleEntryScheduler#scheduleFinally i są poprawnie nazywa.

Twój problem jest this. Gdy funkcja jest wywoływana, this nie jest klasa MyModule (to najprawdopodobniej przedmiotem $wnd). Właśnie dlatego pytanie, które łączysz z użytkownikiem, to var that = this. To około zakresu.

Trzeba też faktycznie wezwanie metoda nie tylko odwoływać się do niej: w JSNI, pierwsza para parens są dla formalnych parametrów (disambiguate przeciążeń), i trzeba inną parę przechodzącą rzeczywiste argumenty: [email protected]::refreshModuleJava()() .

+0

Próbowałem z "var that = this; ' i wywołanie "this. @ mypackage.MyModule :: refreshModuleJava(); ' i wciąż to samo zachowanie –

+0

Aktualizacja odpowiedź z dodatkową informacją, ale to, że 'var = this' powinien mieć co najmniej dokonać zniknąć błąd. –

+0

Rozwinięto podwójny nawias. Dzięki, Thomas. –