Getting each model from a Backbone Collection

25,924

Solution 1

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]) {...});

Solution 2

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

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

Share:
25,924
streetlight
Author by

streetlight

Web Developer living in Philadelphia, PA.

Updated on July 09, 2022

Comments

  • streetlight
    streetlight almost 2 years

    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.