WhatisSober
WhatisSober

Reputation: 988

Override parse function on Backbone Collection

I have a backbone collection:

var user = new Backbone.Collection.extend({
  url: '/user',

  parse: function (response) {
    return response.lunch;
    return response.dinner;
  }
});

which returns a json like this:

[ 
  {
lunch: [{
 appetizer : 'bagel',
 maincourse: 'steak',
 desert: 'sweets'
}]
},
{
dinner: [{
 appetizer : 'chips',
 main: 'rice',
 desert: 'sweets'
 }]
}
]

I want to combine both response.lunch and response.dinner and have a common collection: I tried:

parse: function (response) {
     var collection1 = response.lunch;
     var collection2 = response.dinner;
     return collection1.add(collection2.toJSON(), {silent : true});
   }

But it doesnot work. Also how do i do a each function to override all main with maincourse? I tried:

this.collection.each(function(model) {
  var a = model.get("main");
  model.set({a: "maincourse"});
   }

Any help would be appreciated. Thanks!

Upvotes: 0

Views: 146

Answers (1)

mu is too short
mu is too short

Reputation: 434685

I'm guessing that you want to merge lunch and dinner so that your collection ends up with { appetizer : 'bagel', ... } and { appetizer : 'chips', ... } inside it. If so, then simply concat the two arrays together:

parse: function(response) {
    return response.lunch.concat(response.dinner);
}

If you want to rename all the main attributes to maincourse then you'd want to use get to pull out the mains, unset to remove them, and then set to put them back in with the new name:

var maincourse = model.get('main');
model.unset('main', { silent: true });
model.set('maincourse', maincourse, { silent: true });

or just edit attributes directly:

model.attributes.maincourse = model.attributes.main;
delete model.attributes.main;

or better, just rename the attribute in your parse method.

Upvotes: 1

Related Questions