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

lit*_*m84 28 javascript collections models backbone.js

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

这是一个项目列表,您可以使用鼠标悬停或使用键盘导航.

如果鼠标悬停,或者键盘导航选择了项目,则它们都会执行相同的操作:将特定项目/模型设置为"已选中".

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

selected: false
Run Code Online (Sandbox Code Playgroud)

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

selected: true
Run Code Online (Sandbox Code Playgroud)

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

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

Bil*_*uer 32

被选中似乎是模型范围之外的责任.选择的概念意味着还有其他概念,但模型只能担心自己.因此,我考虑将这一责任转移到其他地方,许多模型的概念和选择的模型似乎更自然和预期.

因此,请考虑将此责任作为关联放在集合上.因此,this.selected将指向所选模型.然后,您可以添加一个方法来返回集合中的选定模型.

或者,您可以对视图负责.如果模型的选择性纯粹是视图层中的关注点,则可以执行此操作.

从模型中删除责任的副产品是,当选择新模型时,您无需循环遍历整个集合.


Jul*_*ess 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;
   }
};
Run Code Online (Sandbox Code Playgroud)