如何根据ID以外的属性从集合中find模型?
我有一个模型与几个对象:
//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
属性来实现这一点。 但我认为应该有一些更简单的方法来做到这一点。
骨干集合支持underscorejs find
方法,所以使用它应该工作。
things.find(function(model) { return model.get('name') === 'Lee'; });
对于简单的基于属性的search,您可以使用Collection#where
:
其中
collection.where(attributes)
返回与传递的属性相匹配的集合中的所有模型的数组。 对于简单的
filter
很有用。
所以如果friends
是你的Friends
实例,那么:
var lees = friends.where({ name: 'Lee' });
还有Collection#findWhere
(后面的内容,如评论中所述):
findWhere
collection.findWhere(attributes)
就像在哪里 ,但直接返回集合中与传递的属性匹配的第一个模型。
所以如果你只有一个,那么你可以说这样的事情:
var lee = friends.findWhere({ name: 'Lee' });
最简单的方法是使用Backbone Model的“idAttribute”选项让Backbone知道你想用“name”作为你的Model Id。
Friend = Backbone.Model.extend({ //Create a model to hold friend attribute name: null, idAttribute: 'name' });
现在你可以直接使用Collection.get()方法来检索一个使用他的名字的朋友。 这种方式Backbone不会循环访问Collection中的所有Friend模型,但可以根据其“名称”直接获取模型。
var lee = friends.get('Lee');
您可以在Backbone集合上调用findWhere()
,它将返回您正在查找的模型。
例:
var lee = friends.findWhere({ name: 'Lee' });