Comment faire Backbone.js les articles de la Collection Uniques?
Dire que j'ai ces Backbone.js Modèle:
var Truck = Backbone.Model.extend({});
var truck1 = new Truck();
var truck2 = new Truck();
truck1.set("brand", "Ford");
truck2.set("brand", "Toyota");
truck3.set("brand", "Honda");
truck4.set("brand", "Ford");
Alors, disons que nous avons un Backbone.js Collection:
var TruckList = Backbone.Collection.extend({
model: Truck,
comparator: function(truck) {
return truck.get("brand");
};
});
Je suis une voiture collector, donc le temps de les ajouter chaque voiture de ma collection:
Trucks = new TruckList();
Trucks.add(truck1);
Trucks.add(truck2);
Trucks.add(truck3);
Trucks.add(truck4);
Simplement se concentrer sur la marque de l'attribut, truck4 est un doublon de truck1. Je ne peux pas avoir des doublons dans ma Collection. J'ai besoin de ma collection de valeurs.
Ma question est, Comment faire pour supprimer les doublons de mon Backbone.js Collection?
Dois-je utiliser Underscore.js pour cette? Si oui, quelqu'un peut-veuillez fournir un travail/praticable exemple de comment faire cela.
Assumer les suivantes:
1.La Collection n'est pas triée
-
Le retrait doit être effectué sur la marque valeur de l'attribut
-
Appel Ajax pour remplir chaque instance d'un Camion. Cela signifie que lors de l'ajout à une collection, vous n'avez pas accès pour le Camion propriétés.
Notez que vous ne pouvez pas assigner des attributs comme ça. Vous devez utiliser le
set
méthode: truck1.set('brand', 'Ford')
. Ensuite, vous pouvez faire plus tard: Trucks.pluck('brand') == ['Ford', 'Toyota', ...]
Sonne comme une bonne idée. Quelqu'un aurait un exemple de travail?
Merci pour la clarification - faute de frappe de ma part. Belle utilisation de l' _.plumer
Toujours à la recherche d'un exemple qui fonctionne!
OriginalL'auteur Keven Ruggish | 2011-06-20
Vous devez vous connecter pour publier un commentaire.
Je voudrais remplacer le
add
méthode dans votre TruckList collecte et l'utilisation de soulignement pour détecter les doublons il y et de rejeter le double. Quelque chose comme.Oups, désolé, dans mon propre sous-classes de la colonne vertébrale.Le modèle que je fasse de la métaprogrammation je n'ai pas besoin d'utiliser le
get
méthode. J'ai mis à jour pour fairetruck.get('brand')
qui devrait fonctionner avec la normale de la colonne vertébrale.De modèle. Je vais avoir besoin de modifier l' _.arracher à utiliser .obtenir ainsi...Je vois où "camion" est passé - c'est le modèle qui a été ajoutée. Mais où est "_truck" en venir? Aussi, est-ce le code assumer la liste est triée? Parce que c'est pas encore.
_truck
est juste pour éviter une collision de nom. Il est utilisé dans la fonction anonyme, nous passons àthis.any
quand nous sommes correspondant à la marque. C'est juste une variable locale qui ne s'étend que sur 2 lignes de champ.vous avez manqué la fermeture des accolades de
any
fonctionOriginalL'auteur Peter Lyons
La façon la plus simple pour atteindre cet est de s'assurer que les modèles sont l'ajout d'avoir des identifiants uniques. Par défaut épine Dorsale des collections ne sera pas ajouter des modèles avec des id en double.
OriginalL'auteur dam
De l'essayer. Il utilise le tout caractère de soulignement méthode pour détecter les éventuels doublons et puis se déverse dans l'affirmative. Bien sûr, vous pourriez souhaiter de s'habiller avec une exception pour être plus robuste:
En aparté, je serais probablement écrire une fonction sur un Camion pour faire la dupe de vérifier que la collection ne pas trop en savoir sur cette condition.
OriginalL'auteur Bill Eisenhauer
VassilisB réponse très travaillé, mais celle-ci remplace l'épine Dorsale de la Collection de la méthode add() de comportement. Par conséquent, des erreurs peuvent venir quand vous essayez de faire ceci:
Donc, j'ai ajouté un peu d'une vérification pour éviter ces erreurs:
OriginalL'auteur Nathan Do
Je suis en train de faire un FileUpload chose avec la même question, et voici comment je l'ai fait (coffeescript):
... et c'est tout. L'objet de collection est automatiquement référencé dans le Fichier, et la Validation est automatiquement appelée quand une action est appelée sur la collection qui dans ce cas est d'Ajouter.
isUnique: (file)-> @.any (f)-> f.get'name') is file.name
OriginalL'auteur George R
Underscore.js un pré-requis pour backbone.js, fournit une fonction pour ça: http://documentcloud.github.com/underscore/#uniq
Exemple:
Je ne suis pas un backbone.js de l'utilisateur, juste un underscore.js de l'utilisateur. Je ne suis pas sûr.
Vous pouvez utiliser
toArray
à partir d'uncollection
neunique
et puisreset
la collection. 😛OriginalL'auteur Teddy
Ne sais pas si c'est une mise à jour soit Dorsale ou un trait de soulignement, mais le
where()
fonction de la colonne vertébrale 0.9.2 pour faire la correspondance pour vous:OriginalL'auteur jlleblanc
Je préfère remplacer la méthode add de ce genre.
OriginalL'auteur Vassilis Blazos
...
Un peu de choses à retenir:
ceci est basé sur la dorsale.collection.où la méthode et à la différence de cette méthode, il va tenter correspondances partielles sur les attributs de modèle au sein d'une collection. Si vous ne voulez pas cela, vous aurez besoin de le modifier pour seulement correspondre exactement. Seulement imiter ce que vous voyez dans la méthode originale.
il doit être capable d'accepter plusieurs attribut correspond, donc si vous avez des attributs de modèle de foo et bar, vous devriez être en mesure de faire la collecte.wherePartialUnique({foo:"vous",un bar:"dude"}). Je n'ai pas testé. 🙂 Je ne l'ai jamais fait une paire clé/valeur.
j'ai aussi bande vide attributs de modèle à partir de l'examen. Je ne m'inquiète pas à ce sujet, mais vous pourriez.
cette méthode ne nécessite pas une collection unique de propriétés du modèle que le comparateur dépend. C'est plus comme en sql, la requête distinct, mais je ne suis pas un sql mec afin de ne pas me tirer dessus si c'est un mauvais exemple 🙂
votre collection est triée par le comparateur de fonction, ainsi, l'une des hypothèses à ce sujet de ne pas être triés est incorrect.
Je crois que cela permet également de résoudre l'ensemble de vos objectifs:
OriginalL'auteur Sneaky Wombat
Il semble comme une solution élégante serait d'utiliser des _.findWhere aussi longtemps que vous avez un peu d'attribut unique (de la marque dans votre cas). _.findWhere sera de retour un match qui est un objet JavaScript et donc truthy ou indéfini qui est falsey. De cette façon, vous pouvez utiliser une seule instruction if.
OriginalL'auteur Baer
Je suis vraiment malheureux avec la accepté de répondre à cette solution. Il contient de nombreuses erreurs. J'ai édité le solution originale pour souligner mes préoccupations, mais je propose la solution suivante en supposant que vous êtes OK salir votre duplicata de la carte d'identité/cid de propriété:
Le seul défaut avec celui-ci, c'est que truckToAdd ID/cid n'est pas conservé. Toutefois, cela ne veut préserver l'ensemble de la fonctionnalité attendue de l'ajout d'un élément à une collection, y compris en passant de fusion: vrai.
OriginalL'auteur Sean Anderson
Je n'étais pas satisfait des réponses apportées pour plusieurs raisons:
{ merge: true }
est inattendu.J'ai fourni une solution qui, je crois, à être plus robuste. Cette solution clones donné des modèles si ils ont des doublons dans la collection, des mises à jour les clones' ID de l'doublons d'ID, et passe ensuite à la liste des doublons et non les doublons sur l'original ajouter une méthode afin qu'elle puisse faire sa magie. Aucun des effets secondaires indésirables pour autant que je suis conscient.
OriginalL'auteur Sean Anderson