Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Completely remove attribute from Backbone.js model

I am trying to totally remove an attribute from a backbone model. The model is being sent to an API that isn't very flexible, and it will break if I send additional attributes over the ones I'm supposed to send, so I need to remove an attribute so it no longer exists.

I tried model.unset, from this question, but when I print out the object the attribute I'm trying to remove is still listed, just with a value of null.

I need the attribute to be completely gone.

My basic structure is:

model.unset("AttrName", "silent");
like image 889
FrizbeeFanatic14 Avatar asked Oct 27 '12 21:10

FrizbeeFanatic14


2 Answers

Override the toJSON method of your model and only include the attributes you wish to send.

Updated: (added code sample)

When extending the model, add a toJSON function and return an object with the desired attributes:

{
    toJSON : function() {
        return {
            name: this.get('name'),
            age: this.get('age'),
            phoneNumber: this.get('phoneNumber')
        };
    }
}
like image 157
Tal Bereznitskey Avatar answered Oct 24 '22 17:10

Tal Bereznitskey


The problem is that you're using the parameters for unset incorrectly. "Silent" should be a part of an options hash, not a separate parameter. This works:

model.unset("AttrName", { silent: true });

The reason for the strange behavior can be seen from the annotated source:

unset: function(attr, options) {
  (options || (options = {})).unset = true;
  return this.set(attr, null, options);
},

The unset method assumes that its options parameter is an object, and attempts to either create or modify it, then passes it on to the set method. If you pass a string instead, then the inadvertent effect of the code is to set the attribute to null, rather than to unset it.

like image 37
McGarnagle Avatar answered Oct 24 '22 17:10

McGarnagle