Knockout:将值从一个模型实例复制到另一个模型实例

时间:2013-12-04 16:12:25

标签: javascript knockout.js

我有两个Knockout Model实例(ModelInstance1和ModelInstance2)。对于这两个实例,所有绑定都已应用,页面加载了两种不同的形式。

用户可以看到一个表单,并允许用户进行内联编辑。对于这个表单,我使用ModelInstance1。

另一种形式是出现在编辑按钮单击上的模态形式。此表单使用ModelInstance2。如果用户单击“取消”,则不会将任何值保存到数据库,并且关闭模态表单。

现在我需要在我的自定义事件上(想象一下,按钮点击)将所有值从一个实例复制到另一个实例。

当然,我可以手动执行此操作:

 ModelInstance2.FirstName(ModelInstance2.FirstName());
 ModelInstance2.LastName(ModelInstance2.LastName());
 etc.

但还有其他方法吗?

考虑到我的模型包含observable,可观察数组,计算和订阅。

2 个答案:

答案 0 :(得分:1)

为您的模型编写构造函数,以便它可以将普通对象作为初始化程序。然后,您可以通过执行

来克隆模型
var modelInstance2=new Model(ko.utils.parseJSON(ko.toJSON(modelInstance1)));

您需要序列化为JSON,然后解析结果以获得深层副本(对象和数组等引用类型的属性是实际副本,而不是对原始副本的引用)。如果你做了

var modelInstance2=new Model(ko.toJS(modelInstance1));

然后你会得到一个浅表副本,并且在modelInstance2中更改任何引用类型属性也会在modelInstance1中更改它。

答案 1 :(得分:0)

怎么样......

var Model = function (firstName, lastName) {
    var self = this;
     self.FirstName = ko.observable(firstName);
     self.LastName = ko.observable(lastName);
     self.clone = function () {
         return new Model(this.FirstName(), this.LastName());
     };
}

var instance1 = new Model('Jon', 'Smith');
var instance2 = instance1.clone();

如果您有淘汰映射扩展可用,您可以随时执行此操作....

var temp = ko.toJS(instance1);
var instance2 = ko.mapping.fromJS(temp);

http://knockoutjs.com/documentation/plugins-mapping.html

如果您不想维护克隆对象的方法,那么映射是一个不错的选择,我可以想到没有其他方法来处理它。这些似乎是你的选择。