在我的Backbone.js应用程序中,我有一组模型。
这些模型可以“活跃”或不活跃。当一个模型变为活动时,我想确保集合中的每个其他模型都处于活动状态。
目前,我通过缓存当前活动的模型,侦听更改事件并确定是否应将缓存模型设置为不活动来实现此目的。
这很有效,但是它不能很好地扩展。不是因为我开始添加越来越多的属性,每个集合的一个模型只应该是正面的,我发现重复的代码是混乱的。
有什么建议吗?
这是我的代码
EOT.Collection.VehiclesBase = Backbone.Collection.extend({
model : EOT.Model.Vehicle,
currentOpen : false,
initialize : function(){
this.on('change:open', this.ensureSingleOpen);
},
ensureSingleOpen : function(changed){
//ensure the last open vehicle closes
if(changed!=this.currentOpen) {
if(this.currentOpen){
this.currentOpen.set('open',false);
}
if(changed.get('open')){
this.currentOpen = changed;
this.trigger('change:currentOpen');
}
}
}
});
答案 0 :(得分:1)
我认为你可以使用内置的each
函数非常干净地完成你想要的事情:
EOT.Collection.VehiclesBase = Backbone.Collection.extend({
model : EOT.Model.Vehicle,
initialize : function(){
this.on('change:open', this.ensureSingleOpen);
},
ensureSingleOpen : function(changed){
this.each(function(m) {
m.set({open: m === changed}, {silent: true});
});
}
});
答案 1 :(得分:1)
似乎@ net.uk.sweet的答案有一个小的语法问题 - 即应该调用this.each而不是设置。
EOT.Collection.VehiclesBase = Backbone.Collection.extend({
model : EOT.Model.Vehicle,
initialize : function(){
this.on('change:open', this.ensureSingleOpen);
},
ensureSingleOpen : function(changed){
this.each(function(m) {
m.set({open: m === changed}, {silent: true});
});
}
});
答案 2 :(得分:0)
这是一个非常轻量级的Backbone库,易于使用。这听起来很棒。
具体来说,你想要使用Picky.SingleSelect(取自github文档):
<强> Picky.SingleSelect:强>
为Backbone.Collection创建单选功能,允许在集合中专门选择单个模型。选择另一个模型将导致取消选择第一个模型。