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).
Hmm. Ho appena scoperto cosa c'era che non andava. Stavo dando il percorso alla funzione in modo errato. : D. Dannazione. – frodo
Volevo solo chiederti, è possibile che io passi gli array java alla funzione javascript mentre sto effettuando la chiamata? Se sì, come? – frodo
modificato la mia risposta per spiegare come gestirlo con diverse opzioni –