我的Backbone.js应用程序中有一组模型。
这是您可以使用鼠标悬停或使用键盘导航的项目列表。
如果鼠标悬停,或者键盘导航选择了该项目,则它们都会做同样的事情:将该特定项目/模型设置为“已选中”。
所以在我的模型中,我有一个基本上叫做
的属性selected: false
当它悬停在上面或用键盘选中时,这将是
selected: true
但是,确保当这一个模型成立时,其他模型都是假的最佳方法是什么?
我目前正在做一个基本的事情,循环遍历集合中的每个模型,然后将所选模型设置为true。但我想知道是否有更好,更有效的方法呢?
答案 0 :(得分:32)
被选中似乎是模型范围之外的责任。选择的概念意味着还有其他概念,但模型只能担心自己。因此,我会考虑将这一责任转移到其他地方,在这种情况下,许多模型的概念和选择的模型似乎更自然和期望。
因此,请考虑将此责任作为关联放在集合上。因此,this.selected将指向所选模型。然后,您可以添加一个方法来返回集合中的选定模型。
或者,您可以对视图负责。如果模型的选择性纯粹是视图层中的关注点,则可以执行此操作。
从模型中删除责任的副产品是,当您选择新模型时,无需循环浏览整个集合。
答案 1 :(得分:15)
这就是我这样做的方式。集合存储对所选模型的引用,但状态保存在模型中。然后可以对其进行调整以允许更复杂的算法来选择选择哪个模型。
JobSummary = Backbone.Model.extend({
setSelected:function() {
this.collection.setSelected(this);
}
});
JobSummaryList = Backbone.Collection.extend({
model: JobSummary,
initialize: function() {
this.selected = null;
},
setSelected: function(jobSummary) {
if (this.selected) {
this.selected.set({selected:false});
}
jobSummary.set({selected:true});
this.selected = jobSummary;
}
};
答案 2 :(得分:3)
我做了像艾森豪尔先生建议的那样的事情。我也想要分页数据的概念。真的不想将所选的页码等混合到集合本身中,所以我为表数据创建了一个“模型”并称之为快照。像这样:
JobSummary = Backbone.Model.extend({});
JobSummaryList = Backbone.Collection.extend({
model: JobSummary
};
JobSummarySnapshot = Backbone.Model.Extend({
defaults: {
pageNumber: 1,
totalPages: 1,
itemsPerPage: 20,
selectedItems: new JobSummaryList(), // for multiple selections
jobSummaryList: new JobSummaryList()
}
});
答案 3 :(得分:1)
查看Backbone.CollectionView,其中包括支持在开箱即用时选择模型。您可以使用setSelectedModel
方法实现的悬停案例。
答案 4 :(得分:1)
您可能希望了解我的两个组成部分:
Backbone.Select具有最小的表面积。尽可能少的方法添加到您的对象。我们的想法是你应该能够使用Backbone.Select mixins几乎无处不在,几乎没有冲突风险。
Backbone.Cycle构建于Backbone.Select之上。它增加了导航方法和一些铃声和口哨声。它可能是绿地项目的更好选择。