2014-02-26 8 views
0

나는 녹아웃과 다음과 같은 문제를 직면하는 완전한 초보자입니다. 녹아웃 요소가 udated되는 것을 방지하는 방법

다음

내 녹아웃은 다음과 같은 방법을 편집 링크의 클릭에라고

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; 
    } 

나는 다시 내 배열 사용자가 업데이트되는 모든 객체의 입력 컨트롤 값의 값을 변경 할 때마다

viewModel.Cancel = function() { 
    viewModel.EditedItem = modelEmployee.EmpRec; 
    } 

에 modelEmployee에서 행을 복사 할. modelEmployee가 관찰 가능으로 설정되어 있지 않지만 여전히 업데이트 중입니다.

많은 포럼을 확인했지만 만족스러운 답변을 찾을 수 없습니다.

+0

'modelEmployee.EmpRec = viewModel.EditedItem; '이것은 객체를 복사하지 않습니다. 참조 만 복사하고 해당 참조는 함수에 대한 참조입니다. 실제 객체의 * deep * 사본을 만들어야합니다. –

+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 트릭 기능을 복사하지 않습니다. 따라서 개체에 함수가 있으면 수동으로 복사해야합니다 (필요한 경우). observables는 실제로 함수이기 때문에 이것은 Knockout과 함께 중요한주의 사항입니다. 따라서 observables 객체가 있다면, serialize/deserialize 트릭이 작동하지 않을 수 있습니다.

관련 문제