I have a situation using backbone.js where I have a collection of models, and some additional information about the models. For example, imagine that I'm returning a list of amounts: they have a quantity associated with each model. Assume now that the unit for each of the amounts is always the same: say quarts. Then the json object I get back from my service might be something like:
{
dataPoints: [
{quantity: 5 },
{quantity: 10 },
...
],
unit : quarts
}
Now backbone collections have no real mechanism for natively associating this meta-data with the collection, but it was suggested to me in this question: Setting attributes on a collection - backbone js that I can extend the collection with a .meta(property, [value])
style function - which is a great solution. However, naturally it follows that we'd like to be able to cleanly retrieve this data from a json response like the one we have above.
Backbone.js gives us the parse(response)
function, which allows us to specify where to extract the collection's list of models from in combination with the url
attribute. There is no way that I'm aware of, however, to make a more intelligent function without overloading fetch()
which would remove the partial functionality that is already available.
My question is this: is there a better option than overloading fetch()
(and trying it to call it's superclass implementation) to achieve what I want to achieve?
Thanks
This meta data does not belong on the collection. It belongs in the name or some other descriptor of the code. Your code should declaratively know that the collection it has is only full of quartz elements. It already does since the url points to quartz elements.
If you really need to get this data why don't you just call
_.uniq(quartzCollecion.pluck("unit"))[0];
Personally, I would wrap the
Collection
inside anotherModel
, and then overrideparse
, like so:The
Collection.refresh()
call updates the model with new values. Passing in a custommeta
value to the Collection as previously suggested might stop you from being able to bind to those meta values.