For Loop over Backbone Collection
Solution 1
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…
- forEach (each)
- ...
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.
Solution 2
You want to loop over the models
property of the collection, not the collection object itself.
Solution 3
for object in object.models
This will give you a model in the collection
praks5432
Updated on June 03, 2022Comments
-
praks5432 almost 2 years
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?