2013-03-07 4 views
6

Es gibt diese $ entry-Methode, die wir in GWT verwenden können, um externem JavaScript zu erlauben, Java-Methoden auszuführen. Sie können die Erklärungen in ihrer Dokumentation https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#callingGWT - Aufruf der Instanzmethode von externem JavaScript

sehen, aber das Beispiel gibt es nur mit statischen Methoden. Ich versuche, es für eine nicht-statische Methode zu schreiben und wenn ich versuche, es zu nennen, ich eine Ausnahme erhalten:

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

Hier ist mein Code:

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

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

Was finde ich sehr lustig Ist dieser Alarm aufgerufen, sehe ich das Ergebnis im Browser, aber der Anruf wird gerade nicht ausgeführt.

Wissen Sie, ob es tatsächlich möglich ist, so etwas zu tun?

+0

Beachten Sie, dass ich mir diesen Beitrag angeschaut habe und es nicht geholfen hat (oder ich etwas verpasst habe) http://stackoverflow.com/questions/9676960/issue-with-calling-instance-method-from-handwritten- Javascript –

Antwort

10

$entry geht es nicht um Aufruf java, es geht um ein paar Dinge gut in GWT zu gewährleisten: Ausnahmen von der GWT.UncaughtExceptionHandler geleitet werden, und Befehle überScheduler#scheduleEntry und Scheduler#scheduleFinally geplant sind korrekt aufgerufen.

Ihr Problem ist die this. Wenn die Funktion aufgerufen wird, ist this nicht Ihre MyModule Klasse (es ist höchstwahrscheinlich das $wnd Objekt). Aus diesem Grund verwendet die Frage, die Sie verknüpft haben, var that = this. Es handelt sich um Scoping.

Sie müssen auch tatsächlich Aufruf die Methode, die sie nicht nur verweisen: in JSNI, das erste Paar von Pars sind für die formalen Parameter (eindeutig zu machen Überlastungen), und Sie müssen ein anderes Paar die tatsächlichen Argumente übergeben: [email protected]::refreshModuleJava()() .

+0

Ich versuchte mit 'var that = this;' und ruft 'that auf. @ mypackage.MyModule :: refreshModuleJava();' und immer noch das gleiche Verhalten –

+0

Aktualisierte Antwort mit zusätzlichen Informationen, aber das 'var that = this 'sollte zumindest den Fehler verschwinden lassen. –

+0

Die doppelte Klammer löste es. Danke Thomas. –