2013-09-06 18 views
7

uzyskać następujące dane z serwera:KO Mapowanie problem z dzieckiem obiektów

var data = [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } } //Child object has data 
      ,{ id: 0, child: null } ]; // Child object is null 

Mam pewne problemy po mapować dane używając wtyczki mapowania nokaut. Problem polega na tym, że wewnętrzny obiekt nie jest tego samego typu.

Po wykonaniu tego:

ko.mapping.fromJS(data, viewModel.data); 

otrzymuję, że pierwszy obiekt ma child właściwość typu Object z danymi. Jednak drugi obiekt ma właściwość child typu Observable, która po rozpakowaniu zwraca wartość null.

Jak mogę to zrobić w obu przypadkach obiekty mają ten sam typ, nawet jeśli ma wartość, a drugi ma wartość zerową. Zmiana sposobu działania serwera nie jest opcją. Oczekuję, że będę miał Object i null lub oba Observables.

JsFiddle here.

Odpowiedz

4

Musisz użyć create option, aby poinformować wtyczkę mapowania, w jaki sposób ma ona odwzorować twoją właściwość child.

Więc jeśli chcesz mieć mając Object i null trzeba powrócić null gdy nieruchomość dziecko jest null:

var mappingOptions = { 
    child: { 
     create: function(options) { 
      if (!options.data) 
       return null; 
      return ko.mapping.fromJS(options.data); 
     } 
    } 
} 

ko.mapping.fromJS(data, mappingOptions, viewModel.data); 

Demo JSFiddle.

Lub jeśli chcesz je zarówno Observables:

var mappingOptions = { 
    child: { 
     create: function(options) { 
      return ko.observable(ko.mapping.fromJS(options.data)); 
     } 
    } 
} 

ko.mapping.fromJS(data, mappingOptions, viewModel.data); 
+0

zawsze przetestuj opcje options.data dla wartości pustej, a następnie zwróć puste ko.observable() –

0

Jak wspomniano, roztwór opcji mapowania, ale upewnij się, że zawsze Test options.data do wartości zerowej a następnie powrócić pusty ko.observable(), w przeciwnym razie będziesz mieć kłopoty z wiązaniem! Spędziłem dużo czasu na znalezieniu tego.

var mappingOptions = { 
    child: { 
     create: function (options) { 
      return options.data != null ? ko.observable(ko.mapping.fromJS(options.data)) : ko.observable(); 
     } 
    } 
}