if (!CMS.Models['Settings']) CMS.Models.Settings = {}; CMS.Models.Settings.Advanced = Backbone.Model.extend({ // the key for a newly added policy-- before the user has entered a key value new_key : "__new_advanced_key__", defaults: { // the properties are whatever the user types in (in addition to whatever comes originally from the server) }, // which keys to send as the deleted keys on next save deleteKeys : [], blacklistKeys : [], // an array which the controller should populate directly for now [static not instance based] validate: function (attrs) { var errors = {}; for (var key in attrs) { if (key === this.new_key || _.isEmpty(key)) { errors[key] = "A key must be entered."; } else if (_.contains(this.blacklistKeys, key)) { errors[key] = key + " is a reserved keyword or has another editor"; } } if (!_.isEmpty(errors)) return errors; }, save : function (attrs, options) { // wraps the save call w/ the deletion of the removed keys after we know the saved ones worked options = options ? _.clone(options) : {}; // add saveSuccess to the success var success = options.success; options.success = function(model, resp, options) { model.afterSave(model); if (success) success(model, resp, options); }; Backbone.Model.prototype.save.call(this, attrs, options); }, afterSave : function(self) { // remove deleted attrs if (!_.isEmpty(self.deleteKeys)) { // remove the to be deleted keys from the returned model _.each(self.deleteKeys, function(key) { self.unset(key); }); // not able to do via backbone since we're not destroying the model $.ajax({ url : self.url, // json to and fro contentType : "application/json", dataType : "json", // delete type : 'DELETE', // data data : JSON.stringify({ deleteKeys : self.deleteKeys}) }) .fail(function(hdr, status, error) { CMS.ServerError(self, "Deleting keys:" + status); }) .done(function(data, status, error) { // clear deleteKeys on success self.deleteKeys = []; }); } } });