2013-10-04 1 views
2

Как вызвать метод Java из Javascript? Я пробовал следующийВызвать Java из Javascript с помощью GWT JNSI

http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#calling

Но это не работает. Я не могу поместить JS в файл Java, потому что библиотека использует обратный вызов. В моем App.html файле:

function pickerCallback(data) { 
     var doc = data[google.picker.Response.DOCUMENTS][0]; 
     var name= doc[google.picker.Document.NAME]; 
     var fileId = data.docs[0].id; 

     // set the path text field 
     //[instance-expr.]@class-name::field-name 
     //[instance-expr.]@class-name::method-name(param-signature)(arguments) 
     // Call static method 
     //@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(name, fileId); 
     $entry(@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(name, fileId)); 
    } 

В SDM_Mailer.java:

private static void setSelectedFolder(String folder, String id) { 
    SDM_Mailer myThis = SDM_Mailer.getInstance(); 
    myThis.textFolder.setText(folder); 
    myThis.folderId = id; 
} 

Когда я загрузить приложение, в дает эту ошибку в консоли браузера:

Uncaught SyntaxError: Unexpected token ILLEGAL

Об этом line:

 $entry(@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(name, fileId)); 

Я также попробовал li ne непосредственно перед этим (прокомментировано сейчас), что также дало ту же ошибку.

ответ

3

I can't put the JS into Java file because the library uses a callback

Это дизайн - цель данного синтаксиса является не разоблачать методы, где они может вызываться внешним JS, но вместо этого вы можете называть его из JSNI. Это связано с тем, что JSNI может быть изменен для фактического вызова метода java.

Если вы хотите вызывать методы Java/GWT из простых js, вы должны разоблачить их для этого. Вы связаны http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#calling, но на самом деле не использовать важную роль:

public static native void exportStaticMethod() /*-{ 
    $wnd.computeLoanInterest = 
     $entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI)); 
}-*/; 

Это важная часть - необходимо выставить функцию, где внешние JS можно назвать, но вы должны сделать это разоблачение изнутри JSNI func. Обратите внимание, что мы не вызываем функцию здесь, просто ссылаясь на нее.

+0

Спасибо, что дополнительное объяснение очень полезно. Документы не отображали метод, который фактически вызывается, и это то, что я думал, что это делалось выше. – Chloe

0

Я думаю, вы пропустили Тип параметра:

$entry(@com.onix.sdm.SDM_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(name, fileId)); 

JSNI хорошо объяснена в DevGuideCodingBasicsJSNI

+0

К сожалению, это не сработало. '$ entry (@ com.onix.sdm.client.SDM_Mailer :: setSelectedFolder (Ljava/lang/String; Ljava/lang/String;) (name, fileId));' Он по-прежнему не работает при первой загрузке с помощью 'Uncaught SyntaxError: Неожиданный токен ILLEGAL'. Я действительно не думаю, что @com является синтаксисом JS. – Chloe