我有一个Backbone视图,可以呈现日历,而日历又会呈现每天的子视图。每天都有一个模型和一个单击事件,可以选择或取消选择日期。如果选择了一天,则保存模型,如果取消选择,则模型将被销毁。
一旦视图的模型被销毁(因为日期被取消选择),如果重新选择日期,我不确定如何在日历日期集合中保存新模型。视图只知道模型 - 没有关于集合的信息。当模型被销毁时,日历视图是否应该处理创建新模型并将其附加到日期视图?或者日期视图是否应该通过集合并自行完成?或者有更好的解决方案吗?
为清晰起见,以下是我的代码的一些片段:
var CalendarView = Backbone.View.extend({
initialize: function () {
this.model.dates.on('reset', this.renderDates, this);
},
renderDates: function () {
// Loop through the number of days to display and create a view for each.
// Find a model for the date. If one doesn't exist, this returns a new model.
model = this.model.dates.completedOn(date.format('YYYY-MM-DD'));
view = new DateView({
model: model
});
$dates.append(view.render().el);
// End loop.
}
});
var DateView = Backbone.View.extend({
events: {
'click .date': 'toggleDate'
},
toggleDate: function () {
if (this.model.selected()) {
this.model.destroy();
}
else {
this.model.save();
}
}
});
感谢您的帮助!
答案 0 :(得分:2)
听起来你应该有这样的设置:
Backbone.Model
。我们称之为M
。Backbone.Collection
来保存所有M
模型。我们称之为C
。Backbone.View
,VM
代表一个选定日期,model
属性为M
。Backbone.View
,VC
代表整月(或一年或任何您展示的内容),collection
属性为C
。然后VC
可以在其收藏集中监听'add'
个事件,并在VM
添加新的选定日期时在适当的位置插入C
。
从M
删除C
也非常简单。 Any event on a model will also be triggered on its collection(如果有的话)。因此,要取消选择日期,只需销毁模型即可。 VC
可以收听其收藏中的'destroy'
个事件,并根据需要清除VM
及其整体显示。
这种方式可以将大部分时间用于与集合交谈以管理您选择的日期,其他所有内容都会通过响应相应的事件来自行排序。
这是一个快速的演示,可以向您展示这些部分是如何组合在一起的:http://jsfiddle.net/ambiguous/TYMTM/