2

JSNI を使用して GWT メソッドの 1 つを公開することに関して質問があります。

GWT クラスの 1 つで、他の UI コンポーネントにメッセージを送信するメソッドを公開しようとしています。

私のアプリケーションエントリポイントで、私はそれを公開します

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

class_a はそのフィールドの 1 つを更新してから、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 メソッドを呼び出すだけです。このメソッド (手書きの JS ではなく GWT から呼び出された場合) は完全に機能します。また、公開されたメソッドが単純なアラートを発することも確認しました。問題は、他のクラスのメソッドを呼び出すことにあると思います。

「(TypeError) 未定義または null 参照記述のプロパティ 'hv' を取得できません。」

最終的に実行される無数の他のメソッドを公開することなく、文字列を元の GWT メソッドに渡す方法はありますか?

4

1 に答える 1

5

JavaScript と同様に、はメソッドへの参照ですが、その時点でそのメソッドをオブジェクトにバインドthis.@myPackage.class_a::fireFoo(Ljava/lang/String;)しません。メソッド内のfromは、参照が取得された時点ではなく、関数が呼び出された時点で決定されます。thisthis

したがって、デリゲートが必要です。

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 に答える