我有两个Knockout Model实例(ModelInstance1和ModelInstance2)。对于这两个实例,所有绑定都已应用,页面加载了两种不同的形式。
用户可以看到一个表单,并允许用户进行内联编辑。对于这个表单,我使用ModelInstance1。
另一种形式是出现在编辑按钮单击上的模态形式。此表单使用ModelInstance2。如果用户单击“取消”,则不会将任何值保存到数据库,并且关闭模态表单。
现在我需要在我的自定义事件上(想象一下,按钮点击)将所有值从一个实例复制到另一个实例。
当然,我可以手动执行此操作:
ModelInstance2.FirstName(ModelInstance2.FirstName());
ModelInstance2.LastName(ModelInstance2.LastName());
etc.
但还有其他方法吗?
考虑到我的模型包含observable,可观察数组,计算和订阅。
答案 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
如果您不想维护克隆对象的方法,那么映射是一个不错的选择,我可以想到没有其他方法来处理它。这些似乎是你的选择。