由于多种原因,您的方法存在问题。
this.model.each(function(day) {
that.$el.append(new DayView({model:day}).render().$el);
});
DayView
在这里,您将元素附加到DayListView
. 您将每个视图的 附加$el
到父视图的$el
. 当子元素具有固定的包装元素时,这是标准的。这是您定义tagName
属性的情况。但是当你不断地重新分配视图的元素时,这是有问题的。
- 您将 ItemView 元素添加到父级
- 你点击选择
undelegateEvents
为 ItemView 调用
- ItemView 的
$el
和el
填充了新模板
delegateEvents
为 ItemView 调用
现在导致您遇到的问题是:
- 旧的 ItemView 内容不会从父视图中删除
- 新的 ItemView 内容未添加到父视图
- 事件被委托给不在 DOM 中的元素
我对您的问题的解决方案是:
window.DayView = Backbone.View.extend({
template: Handlebars.compile($('#day-template').html()),
events: {
'click .select input': 'select'
},
initialize: function () {
this.model.bind('change', this.render, this);
this.setElement(this.template(this.model.toJSON()));
},
render: function() {
this.$el.find('.name').text(this.model.get('name'));
this.$el.find('.select input').attr('checked', this.model.get('selected'));
return this;
},
select: function (event) {
this.model.set({selected:$(event.target).is(':checked')});
}
});
这样您就不会在每次单击复选框时都替换视图的元素。现在这个解决方案很可能远非最佳,但应该指向正确的方向。
希望这可以帮助!