只允许Backbone集合中的一个模型在任何给定时间具有活动属性

时间:2013-10-07 23:59:40

标签: javascript backbone.js

在我的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');
            }
        }
    }
});

3 个答案:

答案 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

这是一个非常轻量级的Backbone库,易于使用。这听起来很棒。

具体来说,你想要使用Picky.SingleSelect(取自github文档):

<强> Picky.SingleSelect:

为Backbone.Collection创建单选功能,允许在集合中专门选择单个模型。选择另一个模型将导致取消选择第一个模型。