2013-03-07 16 views
6

Esiste questo metodo di immissione $ che è possibile utilizzare in GWT per consentire a javascript esterno di eseguire i metodi java. Puoi vedere le spiegazioni nella loro documentazione https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#callingGWT - Chiamare il metodo di istanza da javascript esterno

Tuttavia, l'esempio esiste solo con metodi statici. Sto cercando di scrivere per un metodo non statico e quando provo a chiamarlo, ottengo un'eccezione:

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

Ecco il mio codice:

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

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

quello che trovo molto divertente è chiamato questo avviso, vedo il risultato nel browser, ma la chiamata appena prima non viene eseguita.

Sai se è effettivamente possibile fare una cosa del genere?

+0

Nota che ho dato un'occhiata a questo post e non ha aiutato (o ho perso qualcosa) http://stackoverflow.com/questions/9676960/issue-with-calling-instance-method-from-handwritten- javascript –

risposta

10

$entry non si tratta di chiamare java, si tratta di garantire un paio di cose vanno bene in GWT: eccezioni vengono indirizzati al GWT.UncaughtExceptionHandler e comandi pianificati viaScheduler#scheduleEntry e Scheduler#scheduleFinally sono chiamati in modo corretto.

Il tuo problema è il this. Quando viene chiamata la funzione, this non è la tua classe MyModule (probabilmente è l'oggetto $wnd). Questo è il motivo per cui la domanda che hai collegato utilizza var that = this. Si tratta di ambito.

È inoltre necessario in realtà chiamata il metodo, non solo riferimento: nel JSNI, la prima coppia di parentesi sono per i parametri formali (per disambiguare sovraccarichi), ed è necessario un altro paio passando gli argomenti attuali: [email protected]::refreshModuleJava()() .

+0

Ho provato con 'var that = this;' e chiamando 'that. @ mypackage.MyModule :: refreshModuleJava();' e ancora ottengono lo stesso comportamento –

+0

Risposta aggiornata con informazioni aggiuntive, ma che 'var that = this' dovrebbe avere almeno l'errore scomparire. –

+0

La doppia parentesi l'ha risolto. Grazie Thomas. –

Problemi correlati