2012-06-14 3 views
4

mvc4의 모델에서 녹아웃으로 뷰 모델을 생성합니다. 맵핑 플러그인을 사용하고 있습니다. 현재 코드는 다음과 같습니다.매핑 된 속성이있는 빈 배열을 만들기 위해 ko.mapping을 강제 실행합니다.

첫 번째 : 나는 하나의 코 뷰 모델에 필요한 다른 MVC4 모델을 병합합니다. 둘째

var mergedData = $.extend(true, {}, initialEventData, 
    { "Tickets": initialTicketData }, { "TimeZones": timeZones } 
); 

: 나는 나의 뷰 모델에 계산 기능을 추가하는 일부 매핑을 추가합니다.

var mapping = { 
    'Tickets': { 
     create: function (options) { 
      return new updatedTicket(options.data); 
     } 
    } 
} 

var updatedTicket = function (data) { 
    ko.mapping.fromJS(data, {}, this); 

    this.formattedPrice = ko.computed(function() { 
     return "$" + parseFloat(this.Price()).toFixed(2); 
    }, this); 
} 

는 Finlly : 나는 바인딩을 적용합니다.

var eventViewModel = ko.mapping.fromJS(mergedData, mapping); 

그러나 :는 때때로 티켓 모델은 빈 돌아올 수 있습니다. 이 경우, 매핑 플러그인은 관찰 가능한 배열을 생성하지 않습니다 (분명히). 새로운 티켓을 푸시 할 수 있도록 매핑 된 속성이있는 빈 배열이 필요합니다.

답변

0

매핑 구성에 체크 만 추가하면됩니다. 데이터가 updatedTicket 함수에 있는지 확인하고 그렇지 않은 경우 수동으로 관찰 가능 배열을 만듭니다.

+0

아마도 예제를 제공할까요? – digitzfone

0

기본 티켓 배열을 만들 수있는 container viewmodel을 만듭니다. 또한 콜백 함수에서 "this"를 참조하는 변수를 사용하십시오.

var mapping = { 
    'Tickets': { 
     create: function (options) { 
      return new updatedTicket(options.data); 
     } 
    } 
} 

var updatedTicket = function (data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, this); 

    this.formattedPrice = ko.computed(function() { 
     return "$" + parseFloat(self.Price()).toFixed(2); 
    }, this); 
} 

var viewModel = function () { 
    this.Tickets = ko.observableArray([]); 
    ko.mapping.fromJS(mergedData, mapping, this); 
} 

var eventViewModel = new viewModel(); 
+0

나는'this.Tickets'을 몇 줄 추가로 바꿀 것입니다. var viewModel = function (data) {var data = data || {}, tickets = data.tickets;} - 마크 다운에서 서식을 지정하는 방법을 알고 있다면 채워집니다! –

관련 문제