2

我有一个关于使用 JSNI 公开我的 GWT 方法之一的问题。

我试图在我的一个 GWT 类中公开一个向其他 UI 组件触发消息的方法。

在我的应用程序入口点中,我使用

   public native void exportMethods() /*-{
        $wnd.fireFoo=$entry(this.@myPackage.class_a::fireFoo(Ljava/lang/String;));
   }-*/;

class_a 更新其字段之一,然后从 class_b 调用静态方法。

   public class class_a{

       private String last_msg;

       public void fireFoo(String msg){
           this.last_msg = msg;
           class_b.foo(msg);
       }
   }

class_b 调用许多其他类和静态方法来处理 msg

   public class class_b{
       public static void foo(String msg){
       ...//creates a message object and sends it to UI components
       class_c.foo2(msg);
       ...
       }

   }

基本上,我需要做的就是传递一个字符串并调用一个 GWT 方法。该方法(当从 GWT 调用而不是手写 JS 时)运行良好。我还验证了暴露的方法会触发一个简单的警报。我相信问题在于调用其他类的方法。

我得到:“(TypeError)无法获取未定义或空引用描述的属性'hv'。”

有没有办法将字符串传递给原始 GWT 方法,而不必公开它最终会运行的无数其他方法?

4

1 回答 1

5

就像在 JavaScript 中一样,this.@myPackage.class_a::fireFoo(Ljava/lang/String;)它是对方法的引用,但当时并没有将该方法绑定this对象。从this方法内部将在调用函数时确定,而不是在检索引用时确定。

因此,您需要一个代表

var that = this;
$wnd.fireFoo = $entry(function(s) {
  that.@myPackage.class_a::fireFoo(Ljava/lang/String;)(s);
});

如果它确实如您所说的在 DevMode 中有效,那么它是 DevMode 中的错误。

于 2013-04-10T16:43:24.230 回答