2013-09-06 12 views
7

ottengo i seguenti dati dal server:problema KO Mapping con bambino oggetti

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

sto avendo alcuni problemi dopo che ho mappare i dati utilizzando il plugin mappatura eliminazione diretta. Il problema è che l'oggetto interno child non è dello stesso tipo.

Dopo l'esecuzione di questo:

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

ho ottenere che il primo oggetto ha una proprietà di tipo childObject con i dati. Tuttavia, il secondo oggetto ha una proprietà child di tipo Observable che quando è annullata restituisce null.

Come posso farlo in entrambi i casi gli oggetti hanno lo stesso tipo anche se uno ha valore e l'altro è nullo. Cambiare il modo in cui si comporta il server non è un'opzione. Mi aspetto di avere Object e null o entrambi Observables.

JsFiddle here.

risposta

4

È necessario utilizzare il create option per raccontare il plugin mappatura come dovrebbe mappare la vostra proprietà child.

Quindi, se si vuole avere avere Object e null è necessario restituire null quando la vostra proprietà bambino è 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.

Oppure, se si vuole che sia Observables:

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

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

testare sempre options.data per valore null e quindi restituire vuoto ko.observable() –

0

Come accennato, la soluzione è opzioni di mappatura, ma assicuratevi di sempre prova l'options.data per valore nullo e poi tornare ko.observable vuoto(), altrimenti avrai molti problemi con il binding! Ho passato molto tempo a trovarlo.

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