2014-07-22 3 views
1

우리는 knockout.js를 많이 사용하지만 새로운 시나리오를 실행했습니다. 그것은 ko.toJSON을 중심으로 돌아가지만, 문제를 일으키는 원인이되는 내용은 ko.toJS입니다.ko.toJS에서 개체로 변환

우리는 하나의 속성이 다른 개체의 배열 인 많은 속성을 가진 개체를 가지고 있습니다. ko.toJS을 실행 한 후에는 원래 색인의 이름이 지정된 각 속성이있는 객체가됩니다. 나는이 코드를 테스트 코드에서 복제 할 수 없었습니다. 실제로 ko.toJS은 배열을 다른 테스트에서 배열로 유지합니다.

ko.toJS 예 잘못 얻고 객체로 변환 :

enter image description here

ko.toJS 예 권리를 얻고, 및 배열로 남겨 :

enter image description here

임의 왜 ko.toJS에 대한 생각이 다음에 무엇을보아야하는지 알 수 있습니다 ...!

업데이트

녹아웃의 디버거 버전을 사용하여,이 mapJsObjectGraph에 전달되고 어떻게 배열을보고하는 것입니다 :

enter image description here

+0

녹아웃 디버그 빌드를 다운로드하고 mapJsObjectGraph 함수 (내 녹아웃 -3.0.0 디버그의 1619 행)를 찾을 수 있습니다. 그런 다음 console.log (outputProperties)를 줄 위에 추가하십시오 (1650). return outputProperties; 그리고 KO가 발전하면서 무엇을 만들어 내는지 볼 수 있습니다. – sifriday

+0

Thanks @sifriday - 업데이트 된 정보가 추가되었습니다. 우리는 방금 무언가를 발견했습니다. 객체가 iframe 외부에서 비롯되었으므로 instanceof가 프레임 경계에서 작동하지 않는 것 같습니다. 이 경우 답변을 게시합니다. –

+1

@JamesThorpe 확실히 문제입니다. 'instanceof'는 프로토 타입의 참조를 비교하고 (다른 모든 객체와 마찬가지로)'Array' 프로토 타입은 각 호스트 환경에 대해 고유합니다. – Vache

답변

3

이 녹아웃의 버그입니다. issue has already been opened.

var outputProperties = toString.call(rootObject) === "[object Array]" ? [] : {}; 

이 녹아웃에 사용되는 유일한 장소 instanceof없는 것 같다 :

var outputProperties = rootObject instanceof Array ? [] : {}; 

이에 :

해결 방법은, 상술 한 기능의 라인을 변경 mapJsObjectGraph 인 하지만, 버그 보고서에 따르면.

+0

잘 진단! – sifriday

+0

당신은 자신의 대답을 받아 들일 수 있습니다! – Vache

+0

나는 곧 그렇게 될 것입니다. :) –