60

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

目前,我明确地将每个属性设置为其默认值。是否有任何内置或 JavaScript/Underscore.js/Backbone.js/jQuery 函数可以用来在单个语句中执行此操作?

4

7 回答 7

122
myModel.clear().set(myModel.defaults);
于 2011-07-31T13:54:01.550 回答
6

我想出了以下方法:

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

在调用{silent: true}clear()确保change事件不会被触发;它只会set()随叫随到。

于 2016-04-13T22:10:45.823 回答
5

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

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

var MyModel = Backbone.Model.extends({

    defaults:function(){

        return {
            AnArrayTypeProp:[]
        };
    }

});

二、当需要将模型重置为默认值时

model.clear().set(model.defaults());
于 2014-07-20T07:30:11.503 回答
4

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

扩展骨干网

如果您希望它与所有 Backbone 模型一起使用,您可以扩展 Backbone 本身:

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

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

于 2016-04-18T04:03:23.757 回答
3

我还考虑过将model.clear()andmodel.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);
};

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

于 2014-10-12T11:00:50.410 回答
1

用新的空模型覆盖当前模型的值怎么样:

myModel = new model(); // default values will be considered
于 2015-05-11T14:21:03.330 回答
1

我的解决方案是:

model.clear({silent: true}).set(model.defaults);
于 2018-08-24T19:44:46.593 回答