如何根据ID之外的某些属性从集合中查找模型?

时间:2013-01-20 00:51:19

标签: javascript backbone.js backbone-collections

我有一个包含多个对象的模型:

//Model
Friend = Backbone.Model.extend({
    //Create a model to hold friend attribute
    name: null,
}); 

//objects
var f1 = new Friend({ name: "Lee" });
var f2 = new Friend({ name: "David"});
var f3 = new Friend({ name: "Lynn"});

而且,我会将这些朋友对象添加到集合中:

//Collection
Friends = Backbone.Collection.extend({
    model: Friend,
});

Friends.add(f1);
Friends.add(f2);
Friends.add(f3);

现在我想根据朋友的名字得到一个模型。我知道我可以添加ID属性来实现这一目标。但我认为应该有一些更简单的方法来做到这一点。

4 个答案:

答案 0 :(得分:84)

对于基于简单属性的搜索,您可以使用Collection#where

  

其中 collection.where(attributes)

     

返回集合中与传递的属性匹配的所有模型的数组。适用于filter的简单案例。

因此,如果friends是您的Friends个实例,那么:

var lees = friends.where({ name: 'Lee' });

还有Collection#findWhere(后面添加的内容,如评论中所述):

  

findWhere collection.findWhere(attributes)

     

就像 where 一样,但只直接返回集合中与传递的属性相匹配的第一个模型

所以,如果你只是在一个之后,那么你可以这样说:

var lee = friends.findWhere({ name: 'Lee' });

答案 1 :(得分:64)

Backbone集合支持underscorejs find方法,因此使用它应该有效。

things.find(function(model) { return model.get('name') === 'Lee'; });

答案 2 :(得分:6)

最简单的方法是使用" idAttribute" Backbone Model的选项让Backbone知道你想要使用" name"作为您的模型ID。

 Friend = Backbone.Model.extend({
      //Create a model to hold friend attribute
      name: null,
      idAttribute: 'name'
 });

现在您可以直接使用Collection.get()方法使用他的名字检索朋友。这样Backbone不会遍历Collection中的所有Friend模型,但可以直接根据其" name"来获取模型。

var lee = friends.get('Lee');

答案 3 :(得分:5)

您可以在Backbone集合上调用findWhere(),它将返回您正在寻找的模型。

示例:

var lee = friends.findWhere({ name: 'Lee' });