2011-06-29 56 views
26

我在我的Backbone.js应用程序中有一个模型集合。在Backbone.js集合中选择一个模型的最佳方法?

这是您可以使用鼠标悬停在上面或使用键盘浏览的项目列表。

如果鼠标悬停,或者如果键盘导航有选择的项目,他们都将做同样的事情:设置进行“选择”特定的项目/模型。

所以在我的模型,我有一个属性基本上叫做

selected: false 

当它的上空盘旋,或用键盘选择,这将随后是

selected: true 

但是,什么是最好的确保当这一个模型是真的时,其他人都是假的?

我电流通过集合中的每个模型做骑自行车的基本的东西,然后将所选择的模型是真实的。但我想知道是否有更好,更有效的方法来做到这一点?

回答

31

被选定似乎是模型范围之外的责任。选择的概念意味着其他人,但模型只能担心自己。因此,我会考虑把这个责任推到其他地方,其中许多模型的概念和选择一个似乎更自然和预期。

所以考虑把这个责任放在集合上作为一个关联。所以,这个选择会指向选定的模型。然后你可以添加一个方法来返回一个集合中的选定模型。

或者,您可以将此责任归于视图。如果模型的选择完全是View层中的一个问题,那么你可以这样做。

副产品去除模型的责任是你消除在整个收集需要周期,当一个新的模式变为选中。

+1

谢谢。这样做更有意义。我越来越沉迷,并没有花时间更深入地思考事情应该发生的地方。请谨慎使用 – littlejim84

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() 
    } 
}); 
+2

默认值,请记住它们是在所有JobSummarySnapshot实例中引用的。如果使用像Number/String这样的基元,这不是问题,但当JobSummaryList时这是一个问题。 – ekeren

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; 
    } 
}; 
1

退房Backbone.CollectionView,其中包括支持选择模型,当他们被点击开箱。您可以使用setSelectedModel方法实现的悬停案例。

1

你可能想看看我的两个组成部分:

Backbone.Select具有最小表面积。尽可能少的方法被添加到你的对象。这个想法是,你应该可以在任何地方使用Backbone.Select混合,几乎没有冲突的风险。

Backbone.Cycle是建立在Backbone.Select的顶部。它增加了导航方法和更多的花里胡哨的功能。这可能是绿地项目的更好选择。

相关问题