2012-11-01 2 views
0

Je rencontre actuellement un comportement très inhabituel lorsque j'utilise la méthode each d'une collection Backbone. Dans mon application, j'autorise les utilisateurs à modifier des modèles existants, ce qui inclut l'édition et l'ajout d'un certain nombre de contraintes de temps à ce modèle. Le modèle et ses contraintes de temps sont liés à Backbone Relational. Chaque fois que l'utilisateur clique pour ajouter une nouvelle contrainte de temps, j'ajoute un modèle TimeConstraint à la relation sans l'enregistrer. Si un utilisateur décide alors d'annuler la modification, toutes les contraintes de temps nouvelles/non enregistrées doivent être supprimées de la relation. Cependant, lorsque je boucle sur ma collection, il ne semble pas effectuer l'itération finale.Backbone.Collection.each - Comportement très étrange

je construit un jsFiddle pour illustrer ce comportement ici: http://jsfiddle.net/richardstokes/ZzFgZ/9/

Les étapes à suivre sont les suivantes:

  1. Cliquez sur « Modifier la stratégie »
  2. Ajouter 2 ou plus de nouvelles contraintes de temps en utilisant le « Nouveau temps Constraint » bouton
  3. Annuler les modifications en cliquant sur "Annuler Edits"

Vous remarquerez que la console imprime la longueur de début de la collection time_constraints et la longueur de finition, ainsi que les longueurs intermédiaires après la suppression des modèles non sauvegardés. Il semble toujours s'arrêter court et laisser un élément dans la collection, même s'ils sont tous nouveaux/non enregistrés.

J'apprécierais grandement si quelqu'un m'aiderait avec ce problème, il m'a littéralement coincé toute la journée.

Répondre

1

Vous supprimez des éléments car la collection de timeConstraints est en cours d'itération, ce qui peut provoquer un comportement indéfini. Essayez d'abord obtenir la liste des nouveaux timeConstraints, puis les passer comme un tableau pour remove():

var toRemove = this.model.get('time_constraints').filter(function (timeConstraint) { 
    return timeConstraint.isNew(); 
}); 
this.model.get('time_constraints').remove(toRemove); 
+0

Tout comme une question d'intérêt, pourquoi la suppression des éléments tels que la collection est itéré causer pas ce comportement? Sûrement si la longueur de la collection à la fin d'une itération est toujours supérieure à zéro, l'itération devrait continuer? Je veux juste comprendre le problème plus complètement. –

+0

Je n'ai pas de réponse précise. Selon la documentation, l'implémentation forEach boucle sur les éléments présents au début de l'appel à forEach (voir https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach) et le code source de soulignement. Le doc de mozilla indique que changer le contenu du tableau pendant l'itération signifie que certains éléments peuvent ne pas être visités. En général, ce n'est pas une chose sûre à faire (et certains langages comme .NET provoquent une erreur de manière proactive). – Yossarian21

+0

Ok merci pour la perspicacité. Votre solution a parfaitement fonctionné pour moi. Sera plus prudent de ne pas le faire à l'avenir. –

Questions connexes