Reputation: 339
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");
Upvotes: 11
Views: 11924
Reputation: 102763
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.
Upvotes: 19
Reputation: 2051
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')
};
}
}
Upvotes: 2
Reputation: 120
You might try just building an object with only the properties you want (and sending that):
serializeModel: function() {
return {
email: this.$("#email").val(),
password: this.$("#password").val()
}
}
Upvotes: 0