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");
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')
};
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With