在尝试使用Google Web Toolkit的JSNI包装一些Javascript API时,我遇到了一个问题。 javascript API由基于云的服务器Parse.com提供。我的代码是这样的:
public class MMParseComm {
private MMProject project = new MMProject();//MMProject has a member: String projectName.
private String _projectName;
private native void _retrieveCurrentProject_step1(int projectId) /*-{
var ProjectList = $wnd.Parse.Object.extend("ProjectList");
var query = new $wnd.Parse.Query(ProjectList);
query.equalTo("projectId", projectId);
query.find({
success: function(results) {
//Questions here: In this function, I can access "_projectName" by
//this.@net.myname.myproject.myapi.client.MMParseComm::_projectName,
//but cannot access "project.projectName" using the same syntax.
//Also, I have searched around but cannot find a way
//that can write out a JSON data retrieved in "results"
//as a JSONObject in Java.
},
error: function(error) {
$wnd.alert("Error");
}
});
}-*/;
}
如上面的代码所示,问题在代码的注释部分。
我不知道如何将数组results
中的字符串写入project.projectName
?另外,如何将javascript中从results
检索到的JSON数据包装成Java中的JSONObject?
提前致谢!
卫彬
答案 0 :(得分:0)
我认为JSNI外部调用语法不支持链调用,这就是您无法访问project.projectName的原因。
我假设你有一个 Project 类型的外部JavaScript原型。你最好创建一个overlay type,而不是使用JSONObject API来解析它 - 它更有效,更简单。我会帮你的...
public class MMProject extends JavaScriptObject
{
protected MMProject () { }
public final native String getProjectId() /*-{
return this.projectId;
}-*/;
}
然后使用包装成功回调。
我怀疑结果可能是一个数组类型,因此您的实现可能如下所示:
public class MMParseComm
{
private JsArray<MMProject> projects = null;
private native void _retrieveCurrentProject_step1(int projectId) /*-{
var ProjectList = $wnd.Parse.Object.extend("ProjectList");
var query = new $wnd.Parse.Query(ProjectList);
query.equalTo("projectId", projectId);
query.find({
success: function(results) {
this.@net.myname.myproject.myapi.client.MMParseComm::projects = results;
},
error: function(error) {
$wnd.alert("Error");
}
});
}-*/;
}
在不知道对象模型的细节的情况下,这是我可以建议的最好的。如果您需要进一步明确,我可以帮助您。