2012-04-16 11 views
6

Parece que noquear es no mapear correctamente las propiedades de los objetos en una matriz.Knockout no mapea las propiedades de un objeto en una matriz

ver este ejemplo de la consola de cromo:

> 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 

Así se crea el objeto de javascript, pero la propiedad 'nombre' no quede asignada.

¡Todas las ideas son bienvenidas!

Respuesta

11

De http://knockoutjs.com/documentation/plugins-mapping.html, acerca de la función toJS():

Esto creará un objeto no asignado que contiene sólo las propiedades del objeto mapeado que formaban parte de su objeto original JS.

Como "nombre" no era parte del objeto original que mapeó, no se elimina la asignación. Usted necesita decir el plugin de mapeo para incluir esta propiedad específica:

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

Gracias por la respuesta rápida. ¿Hay alguna manera de modificar el comportamiento para mapear cada propiedad? La documentación no parece mencionar esto. –

+0

@RichardAstbury No lo creo. Necesitará codificarlo en una versión personalizada del plugin de mapeo. – Niko

+2

Desde entonces he encontrado ko.toJSON (viewModel) que parece hacer el trabajo. –

3

Aunque la respuesta de Niko es correcto - hay una manera de superar este problema ..

tengo que decir que es un poco de una fea hackear pero hace el trabajo y es bastante fácil de entender:

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

asigno el modelo vista desde observables a JSON a observables (con todas las propiedades mapeadas) a objetar.

Cuestiones relacionadas