在Backbone中,一旦模型被销毁,如何替换视图模型?

时间:2012-10-20 14:47:41

标签: javascript backbone.js backbone-views backbone-events

我有一个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();
    }
  }
});

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

听起来你应该有这样的设置:

  1. 所选日期的Backbone.Model。我们称之为M
  2. 使用Backbone.Collection来保存所有M模型。我们称之为C
  3. Backbone.ViewVM代表一个选定日期,model属性为M
  4. Backbone.ViewVC代表整月(或一年或任何您展示的内容),collection属性为C
  5. 然后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/