Backbone:将模型从一个集合添加到另一个集合

时间:2014-10-14 18:58:11

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

这是我现在的一般结构:

收藏'A',其视图'A'

要添加模型,您可以打开模态并从列表中进行选择。模态是它自己的观点,'B',与它自己的集合,'B'相关联。视图'B'在点击事件中从视图'A'实例化。

我打算使用'myParent'属性初始化视图'B',所以当从集合b中选择模型时,我可以在视图B中说出这一点:

this.myParent.collection.add(newModel,并向)。

我知道这会起作用,但这种耦合是否过于紧张而不需要?这有什么好的模式吗?我正在考虑将几个不同的事件和触发器传播到不同的地方,但这似乎只会使事情变得复杂而没有太大的附加价值。

1 个答案:

答案 0 :(得分:0)

我在一个应用程序中遇到了类似的问题,该应用程序列出了表中可选模型的集合。根据所选的模型,另一个视图需要确定向用户显示哪些按钮。

在这种情况下,我采用了事件驱动的方法。每次选择视图A中的模型时,我都会触发视图B侦听的事件,并将该模型添加到集合B中。

根据您的情况,可能看起来像这样:



// Your collection view.
var ViewA = Backbone.View.extend({
  
  initialize: function(){
    Backbone.Events.on('modelSelected', this.onModelSelected, this);
    this.listenTo(this.collection, 'add', this.renderList);
  },
                       
  onModelSelected: function(model){
    this.collection.add(model);
  }
  
  renderList: function(){
    // Draw your collection
  }
  
  // Do some clean up of events
  remove: function(){
    Backbone.Events.off('modelSelected', this.onModelSelected, this);
    Backbone.View.prototype.remove.call(this);
  }
  
});
  
  
// Modal View
var ViewB = Backbone.View.extend({
  
  initialize: function(){
    this.collection = new YourCollection();
    this.listenTo(this.collection, 'sync', this.renderCollection);
    this.collection.fetch();
  },
  
  render: function(){
    // Render your modal
    return this;
  },

  renderCollection: function(){
    // Render your collection
  },
    
  // 
  modalSubmit: function(){
    var model = this.getSelectedModel();
    Backbone.Events.trigger('modelSelected', modal);
    this.close();
  }
  
});




我应该注意到这有几点需要注意。首先,我建议选择一个健壮的命名空间事件命名方案。这只是一个例子。其次,从初始化函数中取出通常并不理想,但为了简洁起见,我忽略了控制器的概念。