I'm convinced this is a very easy fix, but none of the posts I've found so far seem to have addressed this directly: how do I loop over a collection to get each model?

The first method I'm trying to use is underscore's each method. Here is my call and function:

collection_var.each(paintThings); 

and here is my function:

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

Right now, this comes out as undefined, and this.model errors:

Uncaught TypeError: Cannot read property 'model' of undefined 

I know the answer is simple, but it's driving me crazy! I'm new to underscore. Can anyone here help? I'm also open to other non-underscore methods if they are faster/better.

I also tried this:

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

but that's not giving me what I want either.

5 Answers

First method: use the models property of your collection:

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

Second method is with the each method:

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

Iterating over every model of a collection eg. as give by backbone.js is

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

In your case it should be something like this

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

I think you should try collection_var.models.each(paintThings). That should give you direct access to the models of a collection.

1

Okay, stupid error! I just had to pass an extra parameter to the function so I can touch the model.

Like this:

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

I'm still going to review all answers and accept the most elegant solution!

I used underscores map.

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy