2

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

3 回答 3

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});
        });
    }
});
于 2013-10-08T08:01:03.533 回答
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});
        });
    }
});
于 2013-10-08T01:24:41.817 回答
0

看看骨干挑剔

这是一个非常轻量级的 Backbone 库,易于使用。这听起来很适合你想做的事情。

具体来说,您可能希望使用 Picky.SingleSelect (取自 github 文档):

Picky.SingleSelect:

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

于 2013-10-08T03:50:49.110 回答