Ответ 1
Позвольте мне объяснить немного больше об экспорте материалов GWT в мир JS. У вас есть несколько вариантов сделать это, но я сосредоточусь на трех методах.
[Изменено]
0- JsInterop: поддерживающие GWT работают в новой функции, чтобы легко экспортировать java-методы в javascript и обернуть объекты javascript. Особенность была очень экспериментальной в 2.7.0, не имеющей некоторых функций, но в 2.8.0 будет почти функциональной. Пожалуйста, ознакомьтесь с Документация по дизайну и другими дискуссиями в списке рассылки.
[END]
1- JSNI. Первый заключается в том, чтобы написать свой собственный jsni, в этом случае вам нужно знать о возможных ошибках, которые вы могли бы сделать. В основном эти ошибки связаны с тем, что вы должны знать, как обращаться с типами. В вашем случае, если вы хотите получить массив javascript (как вы спрашиваете в своем комментарии ниже), решение может быть:
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])
Обратите внимание, что JSNI позволяет передавать только теги primitive
(кроме длинных) и JavaScriptObject
. Поэтому, передавая массив javascript, вы должны получить его с помощью JavaScriptObject
, как в примере. В этом случае, поскольку javascript использует только тип для чисел, args.getNumber
будет возвращать всегда double, и вам нужно преобразовать в java.
2- gwt-exportorter. Для экспорта больших проектов или когда вам нужно обрабатывать сложные объекты и классы, я предпочитаю использовать 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-exportorter будет иметь дело с любыми примитивными типами (даже с длинными) myfunc(long[] args)
, с var-args myfunc(long...args)
, он поддерживает перегрузку метода и многое другое.
3- gwtquery Наконец, если вы предпочитаете gwtquery, вы можете использовать технику для добавления функциональных свойств к любому объекту 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])
С помощью gquery вы можете использовать класс gwt JsArrayMixed
, который всегда возвращает число как double, или вы можете использовать JsCache
, который позволяет преобразовывать числа в любой другой числовой тип в java ((JsCache)ary.get(1, Integer.class)
В качестве резюме я предпочел бы использовать gwt-exportorter как первый вариант, потому что он специализируется на решении этой проблемы. В качестве второго варианта я бы использовал gquery, который является серьезным дополнением к gwt. Наконец, я бы избегал использовать рукописные jsni, если это возможно, Javascript обычно является источником проблем и ошибок (думаю, что главная цель gwt - не обрабатывать js).