在Backbone.js集合中选择一个模型的最佳方法是什么?

时间:2011-06-29 11:35:44

标签: javascript collections models backbone.js

我的Backbone.js应用程序中有一组模型。

这是您可以使用鼠标悬停或使用键盘导航的项目列表。

如果鼠标悬停,或者键盘导航选择了该项目,则它们都会做同样的事情:将该特定项目/模型设置为“已选中”。

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

的属性
selected: false

当它悬停在上面或用键盘选中时,这将是

selected: true

但是,确保当这一个模型成立时,其他模型都是假的最佳方法是什么?

我目前正在做一个基本的事情,循环遍历集合中的每个模型,然后将所选模型设置为true。但我想知道是否有更好,更有效的方法呢?

5 个答案:

答案 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之上。它增加了导航方法和一些铃声和口哨声。它可能是绿地项目的更好选择。