0

JSNI 関数から直接 Java メソッドを呼び出そうとしていますが、何らかの理由で機能しません。ここで何が間違っていますか?:(

これが私のコードです

/**
   For UI button click method...
*/
private native void test(String param)
/*-{

var a=(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

}-*/

private void setTest(String param){Window.alert(param);}

すべての有益なコメントをお待ちしております

4

3 に答える 3

2

ブロックthisの外側への参照を取得する必要があります。function

/**
 * For UI button click method...
 */
private native void test(String param) /*-{
    var theInstance = this;
    var a = ( function b(p) {
        theInstance.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);
    })(param);
}-*/;

private void setTest(String param){
    Window.alert(param);
}
于 2012-05-02T02:21:29.123 に答える
1

this キーワードを使用すると、問題が発生する可能性があります。あなたのコンテキストでは、thisキーワードは閉鎖を指しています

(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

理想的には、GWT がコンパイルする関数を指す必要があります。

private native void test(String param)

この文。

このコード セグメントを使用してみてください (構文が正しいかどうかはわかりません。GWT JSNI wiki で確認してください)。

private native void test(String param)
/*-{    
var a = this.@com.(...).TestClass::setTest(Ljava/lang/String;)(param);    
}-*/

ところで、別の関数を呼び出すことを唯一の目的とする関数を持つことは、コードの匂いです。

于 2011-07-12T05:06:42.433 に答える
0

はい、Zasz が指摘しているように、コードを過度に複雑にしています (本当に JavaScript メソッドを提供したい場合は期待できますが、その場合はまったく別の方法で行う必要があります...)

だから私はコードをテストし、これは動作します:

/*    JNI Example method... */
private native void test(String param) /*-{  
    this.@com.stefank.client._53_JavaScriptOverlayTypes::setTest(Ljava/lang/String;)(param); 
}-*/;

private void setTest(String param){
    Window.alert(param);
} 
于 2011-07-12T07:16:10.567 に答える