我正在尝试使用这个非常基本的代码从本地JSON文件将一些数据加载到Backbone Collection中:
window.Student = Backbone.Model.extend({
});
window.Students = Backbone.Collection.extend({
model: Student,
});
window.AllStudents = new Students();
AllStudents.fetch({ url: "/init.json"});
console.log('AllStudents', AllStudents);
在控制台语句中,AllStudents
为空。但是init.json
肯定被加载了。它看起来像这样:
[
{ text: "Amy", grade: 5 },
{ text: "Angeline", grade: 26 },
{ text: "Anna", grade: 55 }
]
我做错了什么?
更新:我还尝试在reset
调用之上添加.fetch()
侦听器,但这也没有触发:
AllStudents.bind("reset", function() {
alert('hello world');
});
AllStudents.fetch({ url: "/init.json"});
不显示任何提示。
更新2 :尝试使用此脚本(完整转载):
$(function(){
window.Student = Backbone.Model.extend({
});
window.Students = Backbone.Collection.extend({
model: Student,
});
window.AllStudents = new Students();
AllStudents.url = "/init.json";
AllStudents.bind('reset', function() {
console.log('hello world');
});
AllStudents.fetch();
AllStudents.fetch({ url: "/init.json", success: function() {
console.log(AllStudents);
}});
AllStudents.fetch({ url: "/init.json" }).complete(function() {
console.log(AllStudents);
});
});
在第三次fetch()
调用中,甚至只显示一个控制台语句,它是一个空对象。
我现在非常困惑。我做错了什么?
JSON文件作为application / json提供,因此它与此无关。
答案 0 :(得分:18)
JSON文件中的属性名称和非数字属性值必须加双引号(“”)。单引号或无引号会产生错误,并且不会创建可用于创建模型和填充集合的响应对象。
因此。如果将json文件内容更改为:
[
{ "text": "Amy", grade: 5 },
{ "text": "Angeline", grade: 26 },
{ "text": "Anna", grade: 55 }
]
你应该看到非空的集合对象。
您可以更改代码以查看成功和失败,如下所示:
AllStudents.fetch({
url: "/init.json",
success: function() {
console.log("JSON file load was successful", AllStudents);
},
error: function(){
console.log('There was some error in loading and processing the JSON file');
}
});
有关详细信息,请查看ajax响应对象的创建方式可能是个好主意。
答案 1 :(得分:10)
javascript中的I / O操作几乎总是异步的,因此它也适用于Backbone。这意味着仅仅因为AllStudents.fetch
已经返回,它还没有获取数据。因此,当您点击console.log
语句时,尚未获取资源。您应该将回调传递给fetch
:
AllStudents.fetch({ url: "/init.json", success: function() {
console.log(AllStudents);
}});
或者可选地,在jQuery中使用新的promise功能(fetch
将返回一个promise):
AllStudents.fetch({ url: "/init.json" }).complete(function() {
console.log(AllStudents);
});
答案 2 :(得分:1)
fetch()返回如前所述的“成功”通知,但这只表示服务器请求成功。 fetch()带回了一些JSON,但它仍然需要将它填充到集合中。
该集合在内容更新后触发“重置”事件。那是集合准备好使用的时候......
AllStudents.bind('reset', function () { alert('AllStudents bind event fired.'); });
您的第一次更新看起来就像是这样。我做的唯一不同的事情是将fetch()放在事件绑定之前。
答案 3 :(得分:0)
我认为您需要将{add:true}
添加到fetch,
如果你将fetch分配给变量,你也会得到结果, 但是它不在你想要的集合里面