主干集合在重置时不会清空

时间:2012-11-05 04:31:17

标签: javascript backbone.js backbone.js-collections

我有一个日历日模型,在每个日历日,我都有一系列活动。

如果当天有事件,则会刷新集合,没问题,我会显示新事件。但是,如果当天没有事件,则集合不会被清空,并且集合仍然显示从最后一个模型那天开始的事件(前一天如果用户去了第二天)。

我已经在模型的获取成功中创建了集合,所以它不应该是异步问题。

我的模特是


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();

    }
});

2 个答案:

答案 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();