几个星期以来,我一直在玩 Backbone,并根据教程制作了一些简单的应用程序。现在我再次从头开始,并尝试使用 Backbone 提供的不错的功能,就像我应该做的那样。
不过,我的观点妨碍了我。当页面加载时,它会很好地呈现并通过迭代集合来创建其嵌套视图。当我再次调用 render() 以刷新单个条目的整个列表时,所有视图属性似乎都未定义。
单项型号:
Entry = Backbone.Model.extend({
});
条目列表:(json.html 是数据端的占位符)
EntryCollection = Backbone.Collection.extend({
model: Entry,
url: 'json.html'
});
var entries = new EntryCollection();
查看单个条目,该条目填充下划线模板并应在模型更改时重新呈现自身。
EntryView = Backbone.View.extend({
template: _.template($('#entry-template').html()),
initialize: function(){
this.model.on('change', this.render);
},
render: function(){
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
查看为集合中的每个项目呈现 EntryView 的整个条目列表,如果添加了新项目,则应重新呈现自身。该按钮用于测试目的。
EntryListView = Backbone.View.extend({
tagName: 'div',
collection: entries,
events: {
'click button': 'addEntry'
},
initialize: function(){
this.collection.on('add',this.render);
},
render: function(){
this.$el.append('<button>New</button>'); //to test what happens when a new item is added
var els = [];
this.collection.each(function(item){
els.push(new EntryView({model:item}).render().el);
});
this.$el.append(els);
$('#entries').html(this.el);
return this;
},
addEntry: function(){
entries.add(new Entry({
title: "New entry",
text: "This entry was inserted after the view was rendered"
}));
}
});
现在,如果我从服务器获取集合,视图渲染得很好:
entries.fetch({
success: function(model,response){
new EntryListView().render();
}
});
一旦我单击按钮将项目添加到集合中,EntryListView 上的事件处理程序就会捕获“添加”事件并调用 render()。但是如果我在渲染函数中设置断点,我可以看到所有属性似乎都是“未定义的”。没有el
,没有collection
……
我哪里错了?感谢你的协助,
罗伯特