2013-04-10 88 views
2

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

我试图在我的一个GWT类中公开一个方法,该方法将消息发送到其他UI组件。

在我的应用程序入口点我

public native void exportMethods() /*-{ 
     $wnd.fireFoo=$entry([email protected]_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调用许多其他类和静态方法来处理味精

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方法,而不必暴露它将最终运行的无数其他方法?

回答

5

就像在JavaScript中一样,[email protected]_a::fireFoo(Ljava/lang/String;)是对方法的引用,但它不会绑定到this对象那个时候。来自方法内部的this将在函数被调用时确定,而不是检索到引用的时间。

您因而需要一个委托

var that = this; 
$wnd.fireFoo = $entry(function(s) { 
    [email protected]_a::fireFoo(Ljava/lang/String;)(s); 
}); 

如果在DevMode的就像你说的,那么它在DevMode的一个bug确实有效。