我是一个完全的新手,淘汰赛,并面临以下问题。
以下是我的淘汰赛对象
var modelEmployee = {
EmpRec: null
};
var viewModel = {
lookupCollection: ko.observableArray(),
selectedItem: ko.observable(),
EditedItem: ko.observable()
};在单击编辑链接时调用以下方法。我将数组的当前行复制到EditedItem,也复制到对象modelEmployee。
viewModel.EditItem = function (item) {
viewModel.EditedItem(item);
modelEmployee.EmpRec = viewModel.EditedItem;
}如果用户取消了编辑,那么我希望将行从modelEmployee复制回我的数组
viewModel.Cancel = function () {
viewModel.EditedItem = modelEmployee.EmpRec;
}每当用户更改输入控件值时,都会更新所有对象中的控件值。modelEmployee不被设置为可观察的,但仍在进行更新。
我查看了许多论坛,但没有找到满意的答案。
发布于 2014-02-27 13:56:54
因此,为了参数起见,您有一个要复制的employee record对象,该对象如下所示:
function EmployeeRecord(firstName, lastName, emplNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.number = emplNumber;
this.someNestedObject = {
foo: bar
};
}要进行深度复制,您需要创建一个新对象并复制每个字段。如果字段本身就是对象,则需要在副本中创建另一个新对象,并从该对象复制每个字段。类似于:
var myCopy = new EmployeeRecord(source.firstName, source.lastName, source.number);
myCopy.someNestedObject = {
foo: source.foo
};对于具有大量字段的大型对象来说,这可能会变得有些乏味,因此一种稍微懒散的方法是(Ab)使用JSON.stringify和JSON.parse将对象序列化并反序列化为字符串,然后再返回:
var myCopy = JSON.parse(JSON.stringify(source));因此,在您的情况下--如果只需要将对象保留为备份以便稍后进行还原,则可以这样做:
viewModel.EditItem = function (item) {
viewModel.EditedItem(item);
modelEmployee.EmpRec = JSON.stringify(viewModel.EditedItem()); // note: if you really need EmpRec to be an object, just JSON.parse it back again
}当你恢复它时:
viewModel.Cancel = function () {
viewModel.EditedItem(JSON.parse(modelEmployee.EmpRec)); // note: don't parse here if you parsed it when you saved it.
}还请注意,JSON技巧不会复制函数。因此,如果对象中有函数,则需要手动复制它们(如果需要的话)。这是Knockout的一个重要警告,因为可观察实际上是函数,所以如果对象具有可观测性,序列化/反序列化技巧可能对您无效。
https://stackoverflow.com/questions/22049315
复制相似问题