2014-02-26 41 views
0

我是一個完全新手去淘汰並面臨以下問題。如何防止挖空元件被刷新

以下是我的淘汰賽對象

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

'modelEmployee.EmpRec = viewModel.EditedItem;'這不是複製對象。你只是在複製一個引用,並且引用一個函數。您需要製作實際對象的*深*副本。 –

+0

非常感謝!我曾經這麼認爲......但不確定,也無法找到任何其他方式。將深入複製檢查幫助。 – user3357040

回答

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序列化和反序列化對象的字符串並再次:

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的一個重要警告,因爲observables實際上是函數,所以如果你的對象具有可觀察性,序列化/反序列化技巧可能不適用於你。