如何从Javascript调用Java方法?我尝试了以下
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;
}
当我加载应用时,in会在浏览器控制台中显示此错误:
未捕获的SyntaxError:意外的标记ILLEGAL
在这一行:
$entry(@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(name, fileId));
我之前也尝试了这一行(现在评论),这也给出了同样的错误。
答案 0 :(得分:3)
我无法将JS放入Java文件中,因为库使用了回调
这是设计 - 这种语法的目的是而不是来公开可以被外部JS调用的方法,而是让你从JSNI中调用它。这是因为可以修改JSNI以实际调用java方法。
如果要从普通js中调用Java / GWT方法,则必须为此公开它们。您链接了http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#calling,但实际上没有使用重要部分:
public static native void exportStaticMethod() /*-{
$wnd.computeLoanInterest =
$entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
}-*/;
这是重要的部分 - 您必须将函数公开给外部JS可以调用它的位置,但是您必须在JSNI函数中进行公开。请注意,我们不是在此处调用函数,只是引用它。
答案 1 :(得分:0)
我认为你错过了类型参数:
$entry(@com.onix.sdm.SDM_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(name, fileId));
得到了很好的解释