JSNI具有骨干结构

时间:2012-09-24 01:48:46

标签: javascript gwt jsni

在尝试使用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?

提前致谢!

卫彬

1 个答案:

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

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

相关问题