3

ネイティブJavaScriptコードのほとんどをJSNIメソッドからスクリプトに移動し、ネイティブJSNIメソッドを利用してそれらの外部メソッドを呼び出そうとしています。

現在、クリックハンドラーの1つで問題が発生しています。ユーザーが特定の要素をクリックすると、JSNIメソッドはJQueryベースのアニメーションを実行し、コールバックでJavaメソッドを呼び出します。簡単な例は次のとおりです。

public native void attachClickHandler(SomeCustomPanel customPanel) /*-{
    $wnd.jQuery("#theElement").click(function() {
        // some JQuery animation logic here...
        $wnd.jQuery("#theElement").animate({ top: "500px" }, 500, function() {
            customPanel.@com.something.whatever.client.SomeCustomPanel::doSomething()();
        });
        // some other code here...
    });
}-*/;

このコードは機能します。コンパイルされ、期待どおりに動作します。これを外部JavaScriptに移動したいと思います。以下を試してみました。私はこれを外部JavaScriptに入れました:

function attachClickAction(customPanel) {
    $("#theElement").click(function() {
        // other stuff...
        $("#theElement").animate({ top: "500px" }, 500, function() {
            customPanel.@com.something.whatever.client.SomeCustomPanel::doSomething()();
        });
        // other stuff...
    });
}

そして、次のようにネイティブ関数を変更しました。

public native void attachClickHandler(SomeCustomPanel customPanel) /*-{
    $wnd.attachClickAction(customPanel);
}-*/;

しかし、正しくありません。これは正しいJavaScriptではないため、JavaScriptファイルはロードされません。(Chomeの開発ツールから「UncaughtSyntaxError:Unexpectedidentifier」というエラーメッセージが表示されます。)

JSNIメソッドからではなく、外部JavaScriptファイルからJavaメソッドを呼び出す方法はありますか?

重要な場合は、GWT2.4を使用しています。

4

3 に答える 3

5

答えはノーです。外部JavaScript関数からJavaメソッドを明示的に呼び出すことはできません。

ただし、JavaScriptを使用すると、関数自体をパラメーターとして渡すことができるという事実を賢く利用できます。

JavaScript関数を次のように変更しました。

function attachClickAction(callbackFunction) {
    $("#theElement").click(function() {
        // other stuff...
        $("#theElement").animate({ top: "500px" }, 500, callbackFunction);
    // other stuff...
    });
}

そして、私のJavaコードでは、Javaメソッドをコールバック関数パラメーターとして明示的に渡しました。

public native void attachClickHandler(SomeCustomPanel customPanel) /*-{
    $wnd.attachClickAction(function() {
        customPanel.@com.something.whatever.client.SomeCustomPanel::doSomething()();
    });
}-*/;

このように、JSNIメソッドがコンパイルされると、doSomething()Javaメソッドが正しく呼び出され、そのメソッド呼び出し全体が外部のJavaScript関数に正しく渡されます。

于 2012-08-24T22:23:21.243 に答える
4

バニラGWTを使用してJavaScriptから直接Javaclasseのメソッドを呼び出すことはできませんが、 gwt-exporterは、ネイティブJavaScriptから「Java」オブジェクトのメソッドを呼び出すために必要な多くの配管を行います。

次のようなことができます。

Java:

@ExportPackage("")
@Export("MYOBJ");
class MyClass implements Exportable {
   public void doSomething();
}

JavaScript:

MYOBJ.doSomething();

gwt-exporterはGWT2.4でうまく機能します。

于 2012-08-25T05:50:15.780 に答える
2

はい、Java(GWT)メソッドをJavaScript関数としてエクスポートしたり、JavaオブジェクトをJavaScript変数に入れたりすることができます。簡単な例を次に示します。

@Override
public void onModuleLoad() {
  exportJavaMethodsToJs();

  final SomeCustomPanel firstCustomPanel = new SomeCustomPanel("first");
  exportJavaObjectToJs("firstCustomPanel", firstCustomPanel);

  final SomeCustomPanel anotherCustomPanel = new SomeCustomPanel("another");
  exportJavaObjectToJs("anotherCustomPanel", anotherCustomPanel);
}

native void exportJavaMethodsToJs() /*-{
  $wnd.doSomething = function(panel) {
    panel.@com.something.whatever.client.SomeCustomPanel::doSomething()();
  }
  // Export any methods you need in JavaScript here...
}-*/;

native void exportJavaObjectToJs(final String key, final Object object) /*-{
  $wnd[key] = object;
}-*/;

次に、JavaScriptで(onModuleLoad()が呼び出された後!)、次のように簡単に使用できます。

doSomething(firstCustomPanel);
doSomething(anotherCustomPanel);

例は次のようになります。

jQuery("#theElement").click(function() {
    // some JQuery animation logic here...
    $wnd.jQuery("#theElement").animate({ top: "500px" }, 500, function() {
        doSomething(firstCustomPanel);
    });
    // some other code here...
});
于 2012-08-25T09:39:38.183 に答える