web-dev-qa-db-fra.com

Comment trouver un modèle dans une collection selon un attribut autre que l'ID?

J'ai un modèle avec plusieurs objets:

//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"});

et aussi, j'ajouterai ces objets amis à une collection:

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

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

et maintenant je veux obtenir un modèle selon le nom de l'ami. Je sais que je peux ajouter un attribut ID pour y parvenir. Mais je pense qu'il devrait y avoir un moyen plus simple de le faire.

47
Anar

Les collections de backbone prennent en charge la méthode underscorejs find, donc son utilisation devrait fonctionner.

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

Pour les recherches basées sur des attributs simples, vous pouvez utiliser Collection#where :

collection.where(attributes)

Renvoie un tableau de tous les modèles d'une collection qui correspondent aux attributs passés . Utile pour les cas simples de filter.

Donc, si friends est votre instance Friends, alors:

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

Il y a aussi Collection#findWhere (un ajout ultérieur comme indiqué dans les commentaires):

findWhere collection.findWhere(attributes)

Tout comme , mais ne renvoie directement que le premier modèle de la collection qui correspond aux attributs passés .

donc si vous n’êtes qu’après, vous pouvez dire des choses comme:

var lee = friends.findWhere({ name: 'Lee' });
84
mu is too short

Le moyen le plus simple consiste à utiliser l'option "idAttribute" du modèle Backbone pour indiquer à Backbone que vous souhaitez utiliser "name" comme identifiant de modèle.

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

Vous pouvez maintenant utiliser directement la méthode Collection.get () pour récupérer un ami en utilisant son nom. De cette façon, Backbone ne passe pas en boucle dans tous vos modèles Friend de la collection, mais peut directement récupérer un modèle en fonction de son "nom".

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

Vous pouvez appeler findWhere() sur les collections Backbone, qui renverra exactement le modèle que vous recherchez.

Exemple:

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