1

在尝试使用 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?另外,如何将results在 javascript 中检索到的 JSON 数据包装为 Java 中的 JSONObject?

提前致谢!

卫斌

4

1 回答 1

0

我认为 JSNI 外部调用语法不支持链调用,这就是您无法访问 project.projectName 的原因。

我假设您有一个Project类型的外部 JavaScript 原型。你最好在这里创建一个覆盖类型而不是使用 JSONObject API 来解析它——它更高效、更简单。我会让你开始..

public class MMProject extends JavaScriptObject
{
    protected MMProject () { }

    public final native String getProjectId() /*-{
        return this.projectId;
    }-*/; 
}

然后将包装器与您的成功回调一起使用。

我怀疑 results 可能是数组类型,因此您的实现可能如下所示:

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

在不知道您的对象模型的细节的情况下,这是我可以为您提供的最好建议。如果您需要进一步澄清,我可以为您提供帮助。

于 2012-10-08T07:56:14.307 回答