2014-05-11 6 views
-1

knockout 매핑 플러그인을 사용하여 JSON 데이터를 녹아웃 뷰 모델에 매핑합니다. 문제는 JSON 서버 데이터에서 오는 모든 속성을 항상 가지고 있지 않다는 것입니다. 그러나 계산 된 obeservables 그들을 참조하십시오. 그래서 나는 빈 객체 (templateStructure)를 사용하여 첫 번째 매핑에서 모든 관측 가능 객체를 생성하고 모든 속성을 포함하고 현재 데이터로 관측 가능 객체를 채우기 위해 실제 데이터로 seocond 호출을 수행합니다. 이것은 잘 작동하지만 상황을 처리 할 수있는 더 좋은 방법이 있는지 알고 싶습니까?ko.mapping.fromJS를 두 번 호출하는 것이 올바른 일입니까?

이것은 두 번 통화가 지금 일어나고있는 방법입니다. templateStructure는 모든 속성을 가진 dummay 객체이며 데이터는 실제 데이터입니다.

ko.mapping.fromJS(templateStructure, {}, this); 
ko.mapping.fromJS(data, {}, this); 
+0

죄송합니다. 더 많은 정보를 제공해 주셔야합니다. 귀하의 질문이 성과에 관한 것이라면 : 우리에게 물어 보지 마시고, [귀하의 말을 달리십시오] (http://ericlippert.com/2012/12/17/performance-rant/). 귀하의 질문에 귀하의 현재 접근법을 검토하는 것이 더 많은 코드를 포함하고 CodeReview.SE로 넘어가십시오 (FAQ를 읽어보십시오!). 특정 문제 또는 KO 성능 버그가있는 경우 : 우리에게 도움이되는 세부 정보 (완전한 * repro)를 포함하십시오. 행운을 빕니다! – Jeroen

+0

제 질문은 성능에 관한 것이 아니라 동일한 데이터를 가진 동일한 객체에서 mapping.fromJS를 두 번 호출하는 것이 맞는지 여부입니다. – Nishanthan

답변

0

매핑 전에 객체를 병합하여 jQuery 확장 메소드를 사용하여 해결했습니다. 그래서 나는 매핑 함수에 대한 호출 하나만 필요했습니다.

  var mergedData = jQuery.extend(true,data,templateStructure); 
     ko.mapping.fromJS(mergedData, {}, this); 
0

기존보기 모델을 업데이트하려면 mapping.fromJS을 호출하는 것이 옳습니다. AJAX를 사용하여 모델에 대한 업데이트를받는 것이 가장 쉬운 방법입니다 (매핑을 사용하지 않았다면 손으로 직접 속성을 수행해야합니다).

"템플릿보기 모델"을 모든 속성과 함께 작성하여 JSON 응답을받지 못했다고해도 접근 할 수 있습니다. 게다가 JavaScript 코드를 더 쉽게 이해할 수 있습니다. 서버에서 직접 첫 번째 매핑을 만든 경우와 같이 뷰 모델에 어떤 속성이 있는지 서버 측에서 확인할 필요가 없습니다.

그러나 수신 된 모델이 거의 완료되면 항상 customize the "create" of your mapping이 될 수 있습니다. js hasOwnProperty을 사용하여 관찰 가능한 속성을 찾아 누락 된 특성을 추가 할 수 있습니다. 링크에서 문서의 마지막 예는 너무 정확하게 (이 샘플에서 계산 된 관찰을) 새로운 관찰을 추가하는 방법 :

var myChildModel = function(data) { 
    ko.mapping.fromJS(data, {}, this); // this is the view model 

    this.nameLength = ko.computed(function() { // nameLength is added to the vm 
     return this.name().length; 
    }, this); 
} 

을이 샘플에없는 경우에만이 nameLength을 생성하기 위해 조건을 추가 할 수 있습니다 수신 된 데이터는 다음과 같습니다.

(참고 : 필요한 경우 업데이트를 사용자 정의 할 수도 있습니다.)