返回的JSON对象应该是数组

时间:2013-12-05 15:58:22

标签: javascript json backbone.js fetch

我正在使用骨干,我的fetch没有返回任何内容(当我尝试使用each进行迭代时),我仔细查看并发现它触发了一个get请求,这就是返回的内容

{
    "-JA2Ey5xJvV-BfvgmzT3": {
        "date": "10-23-33",
        "title": "le shmow",
        "content": "testing lez post!"
    },
    "-JA2Ey6FwK5eK9mELCnd": {
        "date": "10-23-33",
        "title": "test post",
        "content": "testing lez post!"
    }
}

根据骨干文件:

The server handler for fetch requests should return a JSON array of models.,chrome dev工具包将这些标记为对象?这可能是问题吗?

EDIT主干文档声明:

从服务器获取此集合的默认模型集,在集合到达时将其设置在集合上。选项哈希采用成功和错误回调,它们都将作为参数传递(集合,响应,选项)。当模型数据从服务器返回时,它使用set来(智能地)合并获取的模型,除非你传递{reset:true},在这种情况下,集合将被(有效地)重置。代表Backbone.sync负责自定义持久性策略并返回jqXHR。获取请求的服务器处理程序应返回JSON模型数组。

    console.log(posts.fetch());

    posts.fetch();

    console.log(posts);

    posts.each(function(post) {
        console.log(post.get("title"));
    });

第一个控制台日志显示一组“对象”,其中包含正确的数据等,第二个控制台日志标记为r(不知道这意味着什么?)并且只有长度为0且我可以'看到其中的数据。

当我用它们来迭代它时,我什么都没得到

编辑:让它工作(有点),仍然不知道为什么我需要这个黑客应该是一个简单的操作...也许我做了一些严重的错误。无论如何我可以编辑解析函数,所以我只需输入post.title而不是post.attributes.title

 var Posts = Backbone.Collection.extend({
    model: Post,
    url: base_url + '/posts.json',
      parse: function(response) {
        return _.map(response, function(model, key) {
          //i'm assuming the key of each object is the id of the model
          model['id'] = key;
          return model;
        });
      }
});

posts = new Posts;

posts.fetch().complete(function() {
    posts.each(function(post) {
        console.log(post.attributes.title);
    });
});

1 个答案:

答案 0 :(得分:4)

正如文档所述,您的服务器必须返回JSON格式的模型数组,以使collection.fetch()有效。

如果无法更改服务器响应,则需要使用parse方法将响应转换为数组。

所以在你的馆藏定义中:

YourCollection = Backbone.Collection.extend({

  parse: function(response) {
    return _.map(response, function(model, key) {
      //i'm assuming the key of each object is the id of the model
      model['id'] = key;
      return model;
    });
  }
});

有关解析的详细信息,请参阅:http://backbonejs.org/#Collection-parse