我需要使用backbone.js,我不能在我的视图中“渲染”部分这里是我的代码:
var Vigne = {
Models:{},
Collections: {},
Views:{},
Templates:{}
}
Vigne.Models.Raisin = Backbone.Model.extend({})
Vigne.Collections.Grape = Backbone.Collection.extend({
model: Vigne.Models.Raisin,
url: "./scripts/data/vin.json",
initialize: function (){
console.log("grape initialised");
}
});
Vigne.Views.Grape= Backbone.View.extend({
initialize: function(){
_.bindAll(this,"render");
this.collection.bind("reset",this.render);
},
render: function(){
console.log("render");
console.log(this.collection.length);
}
})
Vigne.Router = Backbone.Router.extend({
routes:{
"": "defaultRoute"
},
defaultRoute: function(){
console.log("defaultRoute");
Vigne.grape = new Vigne.Collections.Grape()
new Vigne.Views.Grape ({ collection : Vigne.grape });
Vigne.grape.fetch();
console.log(Vigne.grape.length);
}
}
);
var appRouter= new Vigne.Router();
Backbone.history.start();
我希望它能在调试器的控制台中显示我的集合长度,看起来好像它没有重置。有什么想法吗?
修改
我在fetch函数中添加了这个:
success: function(){
console.log(arguments);
},
error: function() {
console.log(arguments);
}
});
并且fetch函数在获取json文件时成功,但它不会触发重置函数。
答案 0 :(得分:3)
我通过将fetch函数中的属性设置为true来解决了这个问题:
Vigne.grape.fetch({
reset:true,
error: function() {
console.log(arguments);
}
}
);
答案 1 :(得分:2)
Backbone在获取成功时调用reset(),然后触发重置事件。但如果由于某种原因你的获取失败,你将不会得到任何事件。因此,您必须在fetch方法中传递错误处理程序,并使用它来识别错误并处理它。
Vigne.grape.fetch({
error: function() {
console.log(arguments);
}
});
您也可以通过成功回拨,您将能够知道提取中的问题。 您还可以使用Charles proxy / Chrome Debuuger Tool来确定您是否从后端获得了正确的响应。
您能否将您的回复粘贴到服务器上。您可以改变数据,但只保持格式正确。
修改强> 我可以看到的另一个问题是你没有在模型中定义属性所以在Backbone fetch之后,它会使用从服务器获取的新模型刷新你的集合。 Fetch方法需要来自服务器的json对象数组,并且响应数组中的每个json对象应该与您在模型中默认设置的属性匹配,否则它将无法创建新模型,因此无法刷新你的收藏。你能否解决这个问题并告诉我。