Ответ 1
myModel.clear().set(myModel.defaults);
Мои модели уже имеют хэш defaults
. Когда части представления/страницы reset, я хочу, чтобы модели reset вернулись к исходным значениям по умолчанию.
В настоящее время я явно устанавливаю для каждого атрибута значение по умолчанию. Есть ли что-нибудь встроенное или функция JavaScript/Underscore.js/Backbone.js/jQuery, которую я мог бы использовать для этого в одном утверждении?
myModel.clear().set(myModel.defaults);
Я делаю это, когда у модели есть ненулевые свойства исходного объекта.
сначала определите defaults как функцию
var MyModel = Backbone.Model.extends({
defaults:function(){
return {
AnArrayTypeProp:[]
};
}
});
в секундах, если требуется для модели reset по умолчанию
model.clear().set(model.defaults());
Я также думал об использовании model.clear()
и model.set()
совместно. Затем я столкнулся с проблемой, что я запускаю событие change
дважды.
Использование опции silent
при вызове model.clear()
не является опцией, потому что я также хочу, чтобы событие change
запускалось, когда свойство становится неустановленным.
В итоге я добавил метод 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);
};
Таким образом, вы reset устанавливаете старые атрибуты моделей и получаете допустимое событие change
для каждого старого и нового атрибутов.
Я придумал следующий подход:
reset: function () {
this.clear({silent: true});
this.set(this.defaults);
}
Наличие {silent: true}
в вызове clear()
гарантирует, что событие change
не будет запущено; он будет срабатывать только при вызове set()
.
На основе saabeilin answer и Базовый аннотированный источник, я пришел с оптимальная функция для заполнения необходимости сброса модели.
/**
* Clears the model 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 native reset event
// when listening to a collection.
if (!options.silent) this.trigger('model:reset', this, options);
return this;
},
Следующая строка гарантирует, что даже если атрибут передан как undefined { 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:
_.extend(Backbone.Model.prototype, {
reset: function(attributes, options){
/* ... */
}
});
Отказ от ответственности: не делайте этого, если вы пишете плагин JavaScript lib или Backbone, так как он может столкнуться с другой либойкой или может привести к другому поведению, чем тот, который ожидается человеком, использующим ваш код.
Как переопределить значение текущей модели с новой пустой моделью:
myModel = new model(); // default values will be considered