2013-04-15 3 views
3

Je suis convaincu qu'il s'agit d'une solution très simple, mais aucun des messages que j'ai trouvés jusqu'à présent ne semble avoir abordé directement cette question: comment faire une boucle pour obtenir une collection ?Obtention de chaque modèle à partir d'une collection Backbone

La première méthode que j'essaie d'utiliser est chaque méthode de soulignement. Voici mon appel et la fonction:

collection_var.each(paintThings); 

et voici ma fonction:

function paintThings() { 
     console.log(this); 
     console.log(this.model); 
      var thing_type = this.model.get("type"), 
       thing_other = this.model.get("otherAttribute"); 

       console.log(this.model); 
       console.log(thing_type); 
       console.log(thing_other); 
     } 

En ce moment, cela vient comme non définie et this.model erreurs:

Uncaught TypeError: Cannot read property 'model' of undefined 

I connais la réponse est simple, mais ça me rend fou! Je suis nouveau pour souligner. Quelqu'un peut-il aider? Je suis également ouvert à d'autres méthodes non-underscore si elles sont plus rapides/meilleures.

J'ai aussi essayé ceci:

for (var i = 0, l = collection_var.length; i < l; i++) { 
      console.log(collection_var[i]); 
} 

mais ce n'est pas me donner ce que je veux soit.

Répondre

18

Première méthode: utiliser la propriété models de votre collection:

var myModel 
for(var i=0; i<myCollection.length; i++) { 
    myModel = myCollection.models[i]; 
} 

La deuxième méthode est la méthode each:

myCollection.each(function(model, index, [context]) {...}); 
+0

C'est génial! Merci d'avoir posté les deux options. Votre solution est plus élégante que la mienne car elle n'a pas besoin d'être préalablement définie. Merci encore! – streetlight

+2

@streetlight cela dépend. Déclarer la fonction ailleurs peut vous donner un code de structure plus. C'était juste la manière paresseuse de montrer la solution;) – Loamhoof

+0

@Loamhoof. est-ce qu'il souligne chaque méthode? si oui, alors où est le signe «_». s'il vous plaît, faites-moi savoir .merci – Mahi

0

Je pense que vous devriez essayer collection_var.models.each(paintThings). Cela devrait vous donner un accès direct aux modèles d'une collection.

+0

Non, la méthode underscore sont destinés à être utilisés avec les collections de Backbone, non pas avec les tableaux (bien que cela fonctionnerait, mais ce n'est pas comment il est destiné à être utilisé). – Loamhoof

0

erreur Ok, stupide! Je devais juste passer un paramètre supplémentaire à la fonction afin que je puisse toucher le modèle.

Comme ceci:

function paintThings(thing) { 
    //returns model 
    console.log(thing); 
     var thing_type = thing.get("type"), 
      thing_other = thing.get("otherAttribute"); 

      //These all respond directly 
      console.log(thing); 
      console.log(thing_type); 
      console.log(thing_other); 
    } 

Je vais encore passer en revue toutes les réponses et accepter la solution la plus élégante!

3

itération sur tous les modèles d'une collection, par ex. comme donner par Backbone.js est

books.each(function(book) { 
    book.publish(); 
}); 

Dans votre cas, il devrait être quelque chose comme ça

collection_var.each(function(paintThing){ 
    console.log(paintThing); 
    var thing_type = this.model.get("type"), 
     thing_other = this.model.get("otherAttribute"); 

    console.log(paintThing); 
    console.log(thing_type); 
    console.log(thing_other); 
}); 

http://backbonejs.org/#Collection-Underscore-Methods

0

je souligne carte.

docs = Backbone.Collection.extend(); 

this.subViews = _.map(docs.models, function(doc) { 
    return new DocView({ model: doc }); 
}, this); 
Questions connexes