Fairly new to backbone, so this is a really basic question. I have a Backbone collection passed into a function and I can prove that it has been passed and that the models in the collection have ids.
Here's how I'm setting the ids -
convertToMapObjects: (results) =>
objectList = new ObjectList()
results.each(result)->
testObj = new TestObject()
testObj.set
id = result.get("id")
objectList.add(testObj)
And in another function ( accessed through making the model trigger an event) -
getIds: (objects) =>
ids = (object.id for object in objects)
I think the issue may be because of how I'm iterating through the collection because when I tried doing
for object in objects
console.log(object)
I saw two undefineds. Is this correct? If so, why can't I use a for loop to go through a backbone collection? Also, is there a way I could do so?
A Backbone collection is not an array so for ... in
won't produce the results you're expecting. You want to look at the collection's models
property if you want to use a simple loop.
However, Backbone collections have various Underscore methods mixed in:
Underscore Methods (28)
Backbone proxies to Underscore.js to provide 28 iteration functions on Backbone.Collection. They aren't all documented here, but you can take a look at the Underscore documentation for the full details…
So you can use map
or pluck
if you'd like to avoid accessing the models
property:
ids = objects.map (m) -> m.id
ids = objects.pluck 'id'
The pluck
method is, more or less, just a special case of map
but collections implement a native version rather than using the Underscore version so that they can pluck model attributes rather than simple object properties.
You want to loop over the models
property of the collection, not the collection object itself.
for object in object.models
This will give you a model in the collection