我有一个日历日模型,在每个日历日,我都有一系列活动。
如果当天有事件,则会刷新集合,没问题,我会显示新事件。但是,如果当天没有事件,则集合不会被清空,并且集合仍然显示从最后一个模型那天开始的事件(前一天如果用户去了第二天)。
我已经在模型的获取成功中创建了集合,所以它不应该是异步问题。
我的模特是
Myapp.Models.CalDay = Backbone.Model.extend({ url:'calendar', initialize: function(){ this.get_cal(); }, get_cal: function(){ //calendar doesn't exist, so first time through, Myapp.CurrentCal = this; Myapp.cal.set({'date': new Date(),'draw_slider': true,'put_date':'today'}); Myapp.CurrentCal.Events = new Myapp.Collections.DayEvents(); this.bind('change:date',this.fetch_cal); this.fetch_cal(); } Myapp.CurrentCal.bind("fetched",this.get_view); }, fetch_cal: function(){ console.log(Myapp.CurrentCal.Events); Myapp.Calendar.fetch({ success: function(response) { Myapp.CurrentCal.Events.reset(response.attributes.calendar_events); Myapp.CurrentCal.trigger("fetched"); }, error: function() { alert('error getting calendar'); } }); }, get_view: function(){ console.log(Myapp.CurrentCal.Events); new Myapp.Views.CalendarDay(); } });
答案 0 :(得分:0)
你需要先调用remove()
你的观点(好吧,我之前会提示)渲染下一天的事件。
如果您使用事件呈现新的日期,这不会导致您出现问题,因为视图的容器正在使用这些事件进行过度编写。但是,如果第二天包含零个新事件,则不会写入任何内容,因此您将继续显示前几天仍在显示的事件。
考虑为视图创建close方法,并在视图上执行remove()
函数,同时清理与该视图关联的任何绑定。
我一直在为我的主干应用创建一个config/backone.coffee
并创建一个close()
功能来完成此任务:
class Backbone.View extends Backbone.View
close: ->
@beforeClose() if @beforeClose?
@remove()
@unbind(null,null,this)
答案 1 :(得分:0)
正如documentation所说调用reset
而不传递任何模型作为参数将清空collection
。因此,对于没有days
的所有events
,您需要调用reset
而不将模型作为参数传递,或者如您所述从服务器返回空数组。
和/或者你可以检查success
回调中的响应并根据条件调用
Myapp.CurrentCal.Events.reset(response.attributes.calendar_events);
或
Myapp.CurrentCal.Events.reset();