最简单的方法来重置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