2012-05-04 3 views
1

knockoutjs 매핑 플러그인 2.11에서 viewmodel (배열 요소 사용)이 ko.mapping.fromJS로 업데이트되고 새 배열 요소의 길이가 이전보다 길면 ko.mapping.toJS가 빈 배열 항목을 생성한다는 것을 알았습니다 하나. 녹아웃 매핑이 버그입니까? 빈 배열 항목

매핑 내 초기 데이터

입니다 : 새로운 객체와

var initData = {text: 'Some Text', 
       arr: [{key: 1, value: 'a'}, 
         {key: 2, value: 'b'}]}; 

그런 다음 업데이트보기 모델 : 나는 ko.mapping.toJS을()가 호출 그 후

var newData = {text: 'Changed Text', 
       arr: [{key: 1, value: 'aa'}, 
         {key: 12, value: 'bb'}, 
         {key: 13, value: 'cc'}]}; 

, 내가 발견 세 번째 배열 항목은 빈 객체입니다. 버그인지 또는 무엇인가 놓친 것이 확실하지 않습니다. 내가 알아챈 또 다른 점은 데이터를 처음 업데이트 할 때만 발생한다는 것입니다. initData로 뷰 모델을 갱신 한 후 newData를 다시 갱신하면 결과가 정확합니다. http://jsfiddle.net/gonglei/xgPSq/

편집 : 답변 해 주셔서 감사합니다. Jason. 귀하의 솔루션이 제 실제 상황에 맞지 않는 것 같습니다. 수정 된 데이터 개체를 검색하여 서버로 보내야합니다. 그래서 내가 ko.mapping이라고 부르는 순간 .JSS는 계산 된 함수에 JSON 문자열을 표시하는 것이 아니라 올바른 데이터 객체를 바로 얻을 수 있기를 바랍니다. 나는 ko.mapping.toJS를 호출 한 직후 휴식 지점을 놓고 데이터 객체를 보았고 세 번째 요소는 실제로 비었다. 그리고 내 서버는이 빈 요소를 받았습니다. 스로틀 익스텐더는 나에게 정확한 물체를 주었지만 비동기식입니다. 어쨌든 나는 그것을 버그로보고했다. 개발자가 그것을 확인하거나 해결책을 줄 수 있는지 확인한다.

+0

를 해결한다 : //github.com/SteveSanderson/knockout.mapping – Niko

+0

데이터 객체가 즉시 정확하고 ko.mapping.toJS가 올바른 JSON을 반환합니다. 유일한 문제는 계산 된 결과가 GUI 변경을 유발하지 않는 ko.mapping.toJS입니다. –

+0

또한 Knockout 매핑이 빈 항목을 컬렉션에 채우는 IE 9에서 문제가 발생했습니다. 이 오류는 때때로 발생하기 때문에 진단하기가 어렵습니다. 첫 번째 항목과 마지막 항목 ([[object object] ,,, [object Object]]) 만 채워진 4 개의 항목 JSON 배열이 있습니다. 이상한가? –

답변

0

세 번째 항목은 빈 개체가 아닙니다. 아무튼) (

alert('JSON is ' + ko.mapping.toJSON(self.data)); 

아마 ko.mapping.toJSON : 당신은 당신의 목록이 값을 가지고 바인딩하여 볼 수 있으며, 당신이 변화의 끝에서() 함수를이를 넣어 경우에도, 그것은 올바른 JSON을 반환 제대로 종속 된 것으로 등록하지 않거나 일부 단축키가 필요하며 계산에 사용하기위한 것이 아닙니다. 모든 변경 사항이 후에 일어날 컴퓨팅을 강제로 스로틀 익스텐더를 사용

편집

문제가 가장 아마 HTTPS에서이 버그를보고하는 것입니다 (jsfiddle)

this.json = ko.computed(function() { 
     return JSON.stringify(ko.mapping.toJS(self.data, mapping)); 
    }).extend({ throttle: 1 }); 
+0

답변 해 주신 Jason에게 감사드립니다. 귀하의 솔루션이 제 실제 상황에 맞지 않는 것 같습니다. 내 편집 된 질문보기 – lei

+0

변경 후 즉시 내 답변에 알림을 넣으면 이상한 것입니다. 올바른 JSON을 얻습니다. 내가 발견 한 유일한 문제는 계산 결과가 즉시 발동되지 않아서 html이 업데이트되지 않고 toJSON [항상] (http://jsfiddle.net/EDt6f/)이 올바른 답을 반환한다는 것입니다. –