私はいくつかのオブジェクトを持つモデルを持っています:
//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"});
また、これらのfriendsオブジェクトをコレクションに追加します。
//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'; });
単純な属性ベースの検索では、 _Collection#where
_ を使用できます。
where
collection.where(attributes)
渡されたattributesと一致するコレクション内のすべてのモデルの配列を返します。
filter
の単純な場合に便利です。
friends
がFriends
インスタンスである場合、次のようになります。
_var lees = friends.where({ name: 'Lee' });
_
_Collection#findWhere
_ もあります(コメントに記載されている後の追加):
findWhere
collection.findWhere(attributes)
whereと同じですが、渡されたattributesに一致するコレクション内の最初のモデルのみを直接返します。
したがって、1つだけの後であれば、次のように言うことができます。
_var lee = friends.findWhere({ name: 'Lee' });
_
最も簡単な方法は、Backbone Modelの「idAttribute」オプションを使用して、モデルIDとして「name」を使用することをBackboneに知らせることです。
Friend = Backbone.Model.extend({
//Create a model to hold friend attribute
name: null,
idAttribute: 'name'
});
Collection.get()メソッドを直接使用して、名前を使用して友人を取得できるようになりました。このように、Backboneはコレクション内のすべてのFriendモデルをループしませんが、その「名前」に基づいてモデルを直接フェッチできます。
var lee = friends.get('Lee');
バックボーンコレクションでfindWhere()
を呼び出すことができ、探しているモデルを正確に返します。
例:
var lee = friends.findWhere({ name: 'Lee' });