将元素/函数处理程序传递给gwt函数

时间:2012-11-29 22:15:37

标签: javascript gwt

我正在使用GWT创建一个仅限客户端的库。我正在使用JSNI从JS调用函数是Java。问题是我试图传入元素或函数处理程序,似乎没有发生任何事情。我没有得到GWT或js的例外。这是我的桥梁的JSNI功能。

public static String testMe(Object obj) 
  {
      return "Response to " + obj.toString();     
  }

  public static native void defineBridgeMethod() /*-{
     $wnd.testMe = function(msg) {
        return @com.mycompany.mywebapp.client.MyWebApp::testMe(Ljava/lang/Object;);
     };

  }-*/;

谢谢!

2 个答案:

答案 0 :(得分:4)

您没有使用msg,是否要将该函数作为参数调用:

public static native void defineBridgeMethod() /*-{
  $wnd.testMe = $entry(function(msg) {
    return @com.mycompany.mywebapp.client.MyWebApp::testMe(Ljava/lang/Object;)(msg);
  });
}-*/;

或者您可以直接将该功能分配给窗口:

public static native void defineBridgeMethod() /*-{
  $wnd.testMe = $entry(
    @com.mycompany.mywebapp.client.MyWebApp::testMe(Ljava/lang/Object;)
  );
}-*/;

答案 1 :(得分:2)

将gwt项目导出到js的最简单方法是使用gwt-exporter。 Gwtexporter允许导出任何gwt项目而无需编写单行jsni代码,并且它具有许多功能,允许自定义暴露给js的类和方法,甚至它可以生成js api的文档。

在您的情况下,使用静态方法在类中实现Exportable接口,并注释您的方法。

public class MyClass implements Exportable {
  @Export("$wnd.testMe")
  public static String testMe(Object obj)  {
    return "Response to " + obj.toString();     
  }
}

然后你必须在你的入口点调用exportAll()方法,让gwt编译器和gwtexporter生成器发挥他们的魔力

public void onModuleLoad() {
  ExporterUtil.exportAll();
}

这里有tutorial如何将gwt-library导出到js,尽管该项目的documentation非常好。

使用此技术的一些项目包括chronoscopegwtupload(jsupload)gwtquery(jsquery)