Самый простой способ сбросить модель магистрали до начальных значений по умолчанию?
у моих моделей уже есть defaults хэш. Когда части представления / страницы сбрасываются, я хочу сбросить модели обратно к их исходным значениям по умолчанию.
В настоящее время я явно устанавливаю каждому атрибуту значение по умолчанию. Есть ли что-нибудь встроенное или JavaScript/подчеркивание.js / позвоночник.функция js/jQuery, которую я мог бы использовать для этого в одном операторе?
7 ответов:
Я делаю это, когда модель имеет ненулевые начальные свойства объекта.
во-первых, определить по умолчанию функции
var MyModel = Backbone.Model.extends({ defaults:function(){ return { AnArrayTypeProp:[] }; } });во-вторых, когда необходимо сбросить модель по умолчанию
model.clear().set(model.defaults());
Я придумал следующий подход:
reset: function () { this.clear({silent: true}); this.set(this.defaults); }С
{silent: true}наclear()вызов гарантирует, чтоchangeсобытие не запускается; это будет огонь только наset()звонок.
я также думал об использовании
model.clear()иmodel.set()в сочетании. Затем я столкнулся с проблемой, что я запускаюchangeсобытие дважды. Используя при вызовеmodel.clear()это не вариант, потому что я тоже хочу иметьchangeсобытие срабатывает, когда свойство получает unset.я закончил с добавление
model.reset()метод. Он принимает новый хэш атрибутов и заполняет этот хэш сundefinedзначения для старых ключей атрибутов, не присутствующих в новом атрибуте хэш.Model.prototype.reset = function(attrs, options) { for (var key in this.attributes) { if (key in attrs) continue; attrs[key] = void 0; } return this.set(attrs, options); };таким образом, вы сбрасываете старые атрибуты модели и получаете действительный
changeсобытие для каждого старого и нового атрибута.
на основе saabeilin ответь и аннотированный источник позвоночника, Я пришел с оптимальной функцией, чтобы заполнить необходимость сброса модели.
многоразовый сброс
/** * Clears the model's attributes and sets the default attributes. * @param {Object} attrs to overwrite defaults * @param {Object} options to pass with the "set" call. * @return {Backbone.Model} this object, to chain function calls. */ reset: function(attrs, options) { // adds default option reset to true options = _.extend({ reset: true }, options); // ensure default params var defaults = _.result(this, 'defaults'); attrs = _.defaults(_.extend({}, defaults, attrs), defaults); // apply this.clear({ silent: true }).set(attrs, options); // triggers a custom event, namespaced to model in order // to avoid collision with collection's native reset event // when listening to a collection. if (!options.silent) this.trigger('model:reset', this, options); return this; },следующая строка гарантирует, что даже если атрибут передается как неопределенный
{ test: undefined }оно все равно будет иметь значение по умолчанию.attrs = _.defaults(_.extend({}, defaults, attrs), defaults);вот пример:
var defaults = { test: 1 }, attrs = { test: undefined }; _.extend({}, defaults, attrs); // {test: undefined} _.defaults(_.extend({}, defaults, attrs), defaults); // {test: 1}Расширение Костяка
и если вы хотите его с все модели позвоночника, вы можете расширить сам позвоночник:
_.extend(Backbone.Model.prototype, { reset: function(attributes, options){ /* ... */ } });отказ от ответственности: не делайте этого, если вы пишете плагин JavaScript lib или Backbone, так как он может столкнуться с другой lib или может вызвать другое поведение, чем ожидаемое человеком, использующим ваш код.
Как насчет переопределения значения текущей модели с новой пустой моделью:
myModel = new model(); // default values will be considered
Comments