2012-10-02 29 views
1

外部JavaScript提供了一个应该交给Java方法mycallback的数字。将JavaScript参数从外部javascript传递到java

我已经定义:

的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 

而我的终极目标是与参数类型不是JavascriptObject的Integer,Java方法。我只是认为GWT应该将Javascript对象封装在JavascriptObject中,但它似乎不会。

GWT版本是2.4。

回答

6

GWT将自动一个JS Number值到任何Java数原始类型(intdouble等),JS字符串到Java String和JS布尔到Java boolean。它永远不会通过它们作为JavaScriptObject s。

如果该数字不能为空,那么只需用int参数声明回调。如果它可以为空,那么你就必须明确地创建一个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数作为JavaScriptObject如果它是一个Number对象,而不是数字值,所以这个威力工作:

$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); 
    }); 
+0

这是一个非常有用的答案。这两种建议的方法都有效。我不知道你可以做这种转换到Integer。谢谢! – egaga

2

怎么样使用gwt-exporter发电机暴露你的GWT代码,JS,所以你没有对付JSNI,你可以从中受益的很好的特性,它有(复杂的对象,数组,闭包,overl ays,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> 
+0

很高兴知道,谢谢! – egaga