GWT JSNI方法公开

GWT JSNI method exposure

本文关键字:方法 JSNI GWT      更新时间:2023-09-26

关于使用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)无法获得未定义或null引用描述的属性'hv'。"

是否有一种方法可以将字符串传递给原始GWT方法,而不必暴露它最终将运行的无数其他方法?

就像在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下的一个bug。