Основываясь на ответе saabeilin и источника, аннотированного Backbone , я получил оптимальную функцию для удовлетворения потребности в сбросе модели.
Повторный сброс
/**
* 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}
Расширение Backbone
И если вы хотите его для всех моделей Backbone, вы можете расширить саму Backbone:
_.extend(Backbone.Model.prototype, {
reset: function(attributes, options){
/* ... */
}
});
Отказ от ответственности: неСделайте это, если вы пишете плагин библиотеки JavaScript или Backbone, так как он может столкнуться с другой библиотекой или вызвать поведение, отличное от ожидаемого человеком, использующим ваш код.