这是我现在的一般结构:
收藏'A',其视图'A'
要添加模型,您可以打开模态并从列表中进行选择。模态是它自己的观点,'B',与它自己的集合,'B'相关联。视图'B'在点击事件中从视图'A'实例化。
我打算使用'myParent'属性初始化视图'B',所以当从集合b中选择模型时,我可以在视图B中说出这一点:
this.myParent.collection.add(newModel,并向)。
我知道这会起作用,但这种耦合是否过于紧张而不需要?这有什么好的模式吗?我正在考虑将几个不同的事件和触发器传播到不同的地方,但这似乎只会使事情变得复杂而没有太大的附加价值。
答案 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();
}
});

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