我正在构建一个Backbone / Marionette应用程序来列出不同的卡片组。布局左侧有一个ItemView,包括一个用于添加新集的输入字段和一个用于列出卡集的CompositeView。
Cards.module("Set.SideBar", function(SideBar, App) {
SideBar.SideBarView = Backbone.Marionette.ItemView.extend({
template: "#set-sideBar",
className: "well sidebar-nav",
ui: {
saveBtn: "a.saveSet",
setName: "input[type=text]"
},
events: {
"click .saveSet": "saveSet"
},
saveSet: function(ev) {
ev.preventDefault();
var newSetName = this.ui.setName.val().trim();
var newSet = new Cards.Entities.Set({ name: newSetName });
newSet.save();
// How to add the model to the collection?
}
});
});
我正在寻找将 newSet 添加到下面的CompositeView集合的最佳方法。是否有任何干净的低耦合解决方案来处理?我对backbone.js很新,并且无法想象这是完全不同寻常的事情,但不知怎的,我无法在关于文档中找到我的问题的答案 - 或者只是不理解它们。
Cards.module('Set.List', function(List, App) {
List.SetItemView = Backbone.Marionette.ItemView.extend({
tagName: "tr",
template: "#set-list-item"
});
List.SetView = Backbone.Marionette.CompositeView.extend({
tagName: "table",
className: "table table-bordered table-striped table-hover",
template: "#set-list",
itemView: List.SetItemView,
itemViewContainer: "tbody",
modelEvents: {
"change": "modelChanged"
},
initialize: function() {
this.collection.fetch();
}
});
});
提前感谢您的帮助!
感谢两个答案,他们指引着我朝着正确的方向前进。 collection.create提示也非常有用,解决了我面临的另一个问题!
在Marionette.Controller里面我做这样的事情并简单地分享集合参考:
var setLayout = new Cards.Set.Layout();
Cards.mainRegion.show(setLayout);
var sets = new Cards.Entities.SetCollection();
var listView = new Cards.Set.List.SetView({ collection: sets });
setLayout.listRegion.show(listView);
var sideBarView = new Cards.Set.SideBar.SideBarView({ collection: sets });
setLayout.sideBarRegion.show(sideBarView);
并且新模型只是通过collection.create而不是.save()和.add()添加。
答案 0 :(得分:2)
Backbone.Collection.add可用于将模型添加到现有主干集合。 http://backbonejs.org/#Collection-add
另外,请查看Collection.Create - http://backbonejs.org/#Collection-create
如果您的模型被保留,然后立即添加到该集合,您可以跳过model.save()
然后collection.add()
,然后使用collection.create(model)
编辑:如前所述,从侧边栏视图中显示集合实例
答案 1 :(得分:1)
为了保持视图分离,您可以从一个视图中引发其他视图可以监听并处理的事件。