2012-04-16 7 views
6

Sembra che KO non stia mappando correttamente le proprietà degli oggetti in una matrice.Knockout non sta mappando le proprietà di un oggetto in una matrice

Vedi questo esempio dalla console Chrome:

> var viewmodel = ko.mapping.fromJS({list:[]}); 
undefined 

> viewmodel.list().unshift({ name : ko.observable("Foo") }); 
1 

> viewmodel.list()[0].name(); 
"Foo" 

> var js = ko.mapping.toJS(viewmodel); 
undefined 

> js.list[0].name; 
undefined 

Così si crea l'oggetto JavaScript, ma il 'nome' immobile non viene mappato.

Tutte le idee sono benvenute!

risposta

11

Da http://knockoutjs.com/documentation/plugins-mapping.html, sulla funzione toJS():

questo creerà un oggetto non mappata che contiene solo le proprietà dell'oggetto mappato che facevano parte del vostro oggetto originale JS.

Poiché "nome" non faceva parte dell'oggetto originale mappato, non viene rimosso. Dovete dire il plugin mappatura di includere questa proprietà specifica:

var js = ko.mapping.toJS(viewmodel, { include: ['name'] }); 
+0

Grazie per la risposta rapida. C'è un modo per modificare il comportamento per mappare ogni proprietà? La documentazione non sembra menzionare questo. –

+0

@RichardAstbury Io non la penso così. Sarà necessario codificare il codice in una versione personalizzata del plug-in di mappatura. – Niko

+2

Da allora ho trovato ko.toJSON (viewModel) che sembra fare il lavoro. –

3

Anche se la risposta di Niko è corretta - c'è un modo per superare questo problema ..

devo dire che è un po 'un brutto hackerare ma fa il lavoro ed è abbastanza facile da capire:

ko.mapping.toJS(ko.mapping.fromJSON(ko.toJSON(viewmodel))) 

traccio il modello vista dalla osservabile a JSON per osservabile (con tutte le proprietà mappate) di opporsi.

Problemi correlati