如何防止淘汰元素更新

时间:2014-02-26 17:51:43

标签: knockout.js observable

我是淘汰赛并面临以下问题的新手。

以下是我的淘汰赛对象

    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未设置为可观察但仍在更新。

我查了很多论坛但找不到满意的答案。

1 个答案:

答案 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.stringifyJSON.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技巧可能不适合你。