Javascript 重置主干的最简单方法';将模型转换为初始默认值?

Javascript 重置主干的最简单方法';将模型转换为初始默认值?,javascript,backbone.js,backbone-model,Javascript,Backbone.js,Backbone Model,我的模型已经有了一个默认值散列。当部分视图/页面被重置时,我希望将模型重置回其原始默认值 目前,我显式地将每个属性设置为其默认值。是否有内置的或JavaScript/下划线.js/Backbone.js/jQuery函数可用于在单个语句中执行此操作?当模型具有非空初始对象属性时,我会执行此操作 myModel.clear().set(myModel.defaults); 首先,将默认值定义为一个函数 var MyModel = Backbone.Model.extends({ def

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


目前,我显式地将每个属性设置为其默认值。是否有内置的或JavaScript/下划线.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()
方法。它接受一个新属性散列,并用新属性散列中不存在的旧属性键的
未定义的
值填充该散列

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
事件。

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

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

我提出了以下方法:

reset: function () {
    this.clear({silent: true});
    this.set(this.defaults);
}
clear()
调用中使用
{silent:true}
可确保不会触发
change
事件;它将仅在调用时启动。

根据的答案,我提供了一个最佳功能,以满足重置模型的需要

可重复使用复位 下一行确保即使属性作为未定义的
{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库或主干插件,请不要这样做,因为它可能与另一个库发生冲突,或者可能导致与使用您的代码的人预期的行为不同的行为。

我的解决方案是:

model.clear({silent: true}).set(model.defaults);

但这有点危险,因为如果您没有在默认值中指定{id:null},它将具有与以前相同的id,并且使用save()将其放入服务器,用默认值覆盖服务器中的旧对象!如果您想要一个完全不同的模型,请构造一个新模型:
myModel=new myModel()
.True,但是如果其他对象绑定到同一个对象,则使用该对象会很有用。注意:
defaults
中未列出的任何属性都不会从模型中清除。您可能需要首先调用。您可以使用
{silent:true}
作为清除的参数,以防止更改事件发生。此代码不处理Model.prototype.changedAttributes()来处理取消设置
Model.clear({silent:true})
,时缺少事件的问题。这样可以,但它将破坏绑定到模型的任何事件。如果我在
myModel
上有一个
change
事件,并且我这样覆盖它,a)它不会触发更改事件,b)任何以前绑定的事件都将丢失。使用
.result(model,'defaults
)`来处理对象或函数
defaults
属性。
model.clear({silent: true}).set(model.defaults);