あなたのアプローチは、いくつかの理由で問題があります。
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')});
}
});
このようにして、チェックボックスがクリックされるたびにビューの要素を置き換える必要はありません。現在、このソリューションは最適とはほど遠い可能性がありますが、正しい方向を示しているはずです。
お役に立てれば!