2013-04-18 28 views
14

Sono un nuovo arrivato a GWT e JavaScript. Ci sono domande simili di questo tipo che ho cercato di seguire, ma continuo a fallire.Chiamata funzione Java GWT da JavaScript

Ho un'app GWT, ho bisogno di chiamare una funzione Java da Javascript (sul onclick di un tag href, in particolare.) Il seguito è ciò che ho fatto.

public class JSNITest { 

public static void handleAnchorClick(int a , int b) { 
    Window.alert("Current row and Column is " + a + " " + b); 
} 

public static native void exportMyFunction()/*-{ 
    $wnd.handleAnchorClick = function(param1,param2){ 
     @company.package.class.JSNITest::handleAnchorClick(*)(param1,param2); 
}-*/; 

} 

E nel codice HTML,

<a href="javascript:handleAnchorClick(a1,a2);">link</a> 

(a1 , a2) sono due variabili intere nel mio codice. Ho anche chiamato EnclosingClass.exportMyFunction() nella funzione del punto di ingresso. Continuo a correre in vari tipi di eccezioni (nessuna eccezione di classe Siffatta). Qualcuno può correggermi per favore?

saluti

risposta

29

Mi spiego un po 'più sull'esportazione GWT cose al mondo JS. Hai diverse opzioni per farlo, ma mi concentrerò su tre metodi.

[Modificato]

0- JsInterop: manutentori GWT stanno lavorando in una nuova funzionalità per esportare facilmente metodi Java a JavaScript, e avvolgere oggetti JavaScript. La funzionalità è stata molto sperimentale in 2.7.0 senza alcune funzionalità, ma in 2.8.0 sarà quasi funzionale. Si prega di dare un'occhiata al Design Document e altri discussions nella mailing list.

[FINE]

1- JSNI: Il primo è quello di scrivere il proprio JSNI, in questo caso bisogna essere consapevoli dei possibili errori si potrebbe fare. Fondamentalmente questi errori sono perché devi sapere come affrontare i tipi. Nel tuo caso, se si vuole ottenere un array JavaScript (come si sta chiedendo nel vostro commento qui sotto), la soluzione potrebbe essere:

public static native void exportMyFunction()/*-{ 
    $wnd.handleAnchorClick = @company.package.class.JSNITest::handleAnchorClick(*); 
}-*/; 

public static void handleAnchorClick(JsArrayMixed args) { 
    Window.alert("Current row and Column is " + 
       args.getNumber(0) + " " + args.getNumber(1)); 
} 

public void onModuleLoad() { 
    exportMyFunction(); 
} 

//javascript code 
window.handleAnchorClick([1,2]) 

Nota che JSNI consente solo di passare primitive tipi (eccetto lungo) e JavaScriptObject oggetti. Quindi, quando si passa un array javascript, è necessario riceverlo con un JavaScriptObject come nell'esempio. In questo caso, dal momento che javascript utilizza solo un tipo per i numeri, args.getNumber restituirà sempre un doppio e sarà necessario convertire in java.

2- GWT-esportatore Per l'esportazione di grandi progetti, o quando è necessario gestire oggetti complessi e classi preferirei usare gwt-exporter

static class MyClass implements Exportable { 
    @Export("$wnd.handleAnchorClick") 
    public static void handleAnchorClick(double[] args) { 
    Window.alert("Current row and Column is " +args[0] + " " + args[1]); 
    } 
} 

public void onModuleLoad() { 
    GWT.create(MyClass.class); 
} 

//javascript code 
window.handleAnchorClick([1,2]) 

GWT-esportatore si occuperà di qualsiasi tipo di tipi primitivi (anche con lunghi) myfunc(long[] args), con var-args myfunc(long...args), supporta il sovraccarico del metodo e molto altro.

3- gwtquery Infine, se si preferisce gwtquery, è possibile utilizzare una tecnica per aggiungere le proprietà delle funzioni a qualsiasi oggetto come js window

// The GQuery Properties object is able to wrap a java Function object 
// into an js property. 
Properties wnd = window.cast(); 
wnd.setFunction("handleAnchorClick", new Function() { 
    public void f() { 
    // Get the js arguments[] array 
    JsArrayMixed args = arguments(0); 
    // Get the first element of the arguments[] array 
    JsArrayMixed ary = args.getObject(0); 

    Window.alert("Current row and Column is " + 
        ary.getNumber(0) + " " + ary.getNumber(1)); 
    } 
}); 

//javascript code 
window.handleAnchorClick([1,2]) 

Con gquery è possibile utilizzare la classe di GWT JsArrayMixed che restituisce sempre un numero come un doppio, oppure è possibile utilizzare un JsCache che permette di convertire i numeri in qualsiasi altro tipo numerico in java ((JsCache)ary.get(1, Integer.class)

in sintesi, avrei preferito usare gwt-exporter come prima opzione perché è specializzata nella gestione di questo problema. Come seconda opzione, vorrei usare gquery che è un complemento serio di gwt. Infine, eviterei di usare lo scritto a mano jsni quando possibile, Javascript è normalmente una fonte di problemi ed errori (si pensi che l'obiettivo principale di gwt non è quello di gestire js).

+0

Hmm. Ho appena scoperto cosa c'era che non andava. Stavo dando il percorso alla funzione in modo errato. : D. Dannazione. – frodo

+0

Volevo solo chiederti, è possibile che io passi gli array java alla funzione javascript mentre sto effettuando la chiamata? Se sì, come? – frodo

+0

modificato la mia risposta per spiegare come gestirlo con diverse opzioni –

1

Si consiglia di considerare l'esportatore GWT. Potresti anche considerare di aspettare perché GWT 2.8 dovrebbe uscire abbastanza presto. Doveva uscire un po 'di tempo. L'accattonaggio del 2015. Il 2015 è già iniziato e stanno dimostrando a GWT.create in questo momento, quindi dovrebbe uscire da un giorno all'altro. Se non puoi aspettare allora puoi usare sperimentale è interop, JSNI come la risposta più alta dice a o esportatore GWT. JSNI è più complicato e richiede molto codice della piastra della caldaia, quindi se devi fare un sacco di jop interop, consiglio GWT-exporter.

+0

mi potete aiutare un po 'con la mia domanda: http://stackoverflow.com/questions/30990652/gwt-exporter-working -esempio – Loco

Problemi correlati