最简单的方法来重置Backbone的模型到初始默认值?

我的模型已经有一个defaults散列。 当部分视图/页面重置时,我希望将模型重置为其原始默认值。

目前,我明确地将每个属性设置为其默认值。 有什么内置的或JavaScript / Underscore.js / Backbone.js / jQuery函数,我可以用一个语句做到这一点?

 myModel.clear().set(myModel.defaults); 

当模型具有非空初始对象属性时,我这样做。

首先,将默认值定义为函数

 var MyModel = Backbone.Model.extends({ defaults:function(){ return { AnArrayTypeProp:[] }; } }); 

第二,当需要重置模型为默认

 model.clear().set(model.defaults()); 

我也考虑过使用model.clear()model.set() 。 然后我遇到了问题,现在我触发了两次change事件。 调用model.clear()时,使用silent选项不是一个选项,因为我还想在触发某个属性时触发一个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); }; 

这样,您可以重置模型的旧属性,并获取每个新旧属性的有效change事件。

我想出了以下方法:

 reset: function () { this.clear({silent: true}); this.set(this.defaults); } 

clear()调用中拥有{silent: true}可确保change事件不被触发; 它只会在set()调用时触发。

基于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; }, 

下面这一行确保即使一个属性被传递为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} 

扩展骨干

如果你想要所有的骨干模型,你可以扩展骨干本身:

 _.extend(Backbone.Model.prototype, { reset: function(attributes, options){ /* ... */ } }); 

免责声明:如果您正在编写JavaScript lib或Backbone插件,请不要这样做,因为它可能会与另一个lib发生冲突,或者导致与使用您的代码的人所期望的行为不同的行为。

如何用新的空模型覆盖当前模型的价值:

 myModel = new model(); // default values will be considered