我是淘汰赛并面临以下问题的新手。
以下是我的淘汰赛对象
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未设置为可观察但仍在更新。
我查了很多论坛但找不到满意的答案。
答案 0 :(得分:0)
所以,让我们说,为了论证,你有一个你想要复制的员工记录对象,如下所示:
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
将对象序列化和反序列化为a字符串又回来了:
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的一个重要警告,因为observable实际上是函数,所以如果你的对象有observable,那么serialize / deserialize技巧可能不适合你。