我正在使用骨干,我的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);
});
});
答案 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