JSNI - вызвать метод Java из функции JS - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь вызвать метод Java прямо из моей функции JSNI, но по какой-то причине он никогда не работает. Что я здесь не так делаю? (

Вот мой код

/**
   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);}

Все полезные комментарии приветствуются

Ответы [ 3 ]

2 голосов
/ 02 мая 2012

Вам нужно взять ссылку на 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);
}
1 голос
/ 12 июля 2011

Использование этого ключевого слова может вызвать проблему. В вашем контексте ключевые слова 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);    
}-*/

Кстати, наличие функции, единственной целью которой является вызов другой функции, является запахом кода.

0 голосов
/ 12 июля 2011

Да, как указывает 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);
} 
...