外部javascript给出一个应该移交给名为mycallback
的Java方法的数字。
我定义了:
爪哇:
class MyClass {
public static void mycallback(JavaScriptObject number) {
// do something with the number
}
}
使用Javascript:
$wnd.callback = $entry(@com.package.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject));
Javascript调用是:
$wnd.callback(number_from_external_javascript);
但我得到错误:
JS value of type number, expected com.google.gwt.core.client.JavaScriptObject
我的最终目标是使用参数类型为Integer
的java方法,而不是JavascriptObject。我只是认为GWT应该在JavascriptObject中包装javascript对象,但它似乎不会。
GWT版本是2.4。
答案 0 :(得分:7)
GWT将自动投射 JS数值到任何Java数字基元类型(int
,double
等),JS String to Java String和JS Boolean到Java boolean
。它永远不会传递给JavaScriptObject
s。
如果数字不能为null,则只需使用int
参数声明回调。如果它可以为null,那么您必须显式创建Integer
实例,例如:
$wnd.callback = $entry(function(n) {
if (number != null) {
// box into java.lang.Integer
number = @java.lang.Integer::valueOf(I)(n);
}
@com.packge.MyClass::mycallback(Ljava/lang/Integer;)(number);
});
或者,我认为如果JS编号为Number对象而不是Number值,则可以将JS编号作为JavaScriptObject
传递,因此可能工作:
$wnd.callback = $entry(function(n) {
n = new Number(n); // "box" as a Number object
@com.packge.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject;)(n);
});
答案 1 :(得分:2)
使用gwt-exporter生成器将你的gwt代码暴露给js怎么样,所以你不必处理jsni,你可以从它的好功能中受益(复杂的对象,数组,闭包,叠加,doclet)等等)
使用gwt-exporter,您的类只需要实现Exportable并使用注释来公开您的方法。
public static class MyClass implements Exportable {
@Export("$wnd.mycallback")
public static void mycallback(long number) {
Window.alert("" + number);
}
}
将此行添加到onmoduleload并让编译器继续工作
public void onModuleLoad() {
ExporterUtil.exportAll();
}
然后你可以像你说的那样使用这个方法
<script>
window.mycallback(1234)
</script>