2012-03-11 22 views
7

Estoy tratando de asignar una matriz de objetos a un array observable con el complemento de mapeo knockout. De alguna manera esto parece no funcionar para mí en absoluto.Arreglo de asignación de comportamiento extraño a array observable con ko.mapping.fromJS

solo he probado con la consola de Crome para verificar:

ko.mapping.fromJS([ { x: 1, y: "test" } ]) 

returns: 
[] 

¿Qué estoy haciendo mal? Si trato de la siguiente

ko.mapping.fromJS([ { x:1, y: "test" } ][0]) 

returns an object containing x and y as observables... 

que todo funciona bien. La única diferencia es que solo entrego un solo objeto en lugar de una matriz de objetos. Pero si leo la documentación del plugin de mapeo correctamente, debería ser capaz de manejar la creación de un array observable fuera de una matriz normal.

Gracias por su ayuda,
Andreas

+7

En la consola de Chrome asegúrese que está mirando el valor desenvuelto de la matriz observable 'myObservableArray()'. Puede ser engañoso cuando se imprime el Array observable. –

+4

Como RP declaró ... solo estás buscando el valor equivocado. Aquí hay un violín que puede usar para verificar. Establezca un punto de interrupción en la línea ko.mapping y escriba: ko.mapping.fromJS (data) y verá []. Si escribe: ko.mapping.fromJS (data)() y verá [Object, Object, Object, Object]. http://jsfiddle.net/jearles/y4b9e/8/ –

+1

Gracias chicos, Chrome me engañó al imprimir solo [] que indica una matriz vacía. Pero tiene toda la razón, si solo me mantengo detrás de la expresión, muestra el contenido correctamente. Genial para recibir comentarios tan pronto! Stackoverflow rocks ... – nttakr

Respuesta

1
ko.mapping.fromJS(data, {}, self.items); 
1

Eso es lo que debe estar haciendo (al menos en teoría y/o documentación), pero al parecer eso no es lo que está haciendo. Estoy teniendo el mismo problema y creo que otros también: https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

el objeto debe ser:

{ "someName" : [ { x: 1, y: "test" } ] } 

para seguir con su esquema de objetos, puede utilizar ko.utils.arrayMap para mapear objetos a su modelo de vista KO : http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html

function Item(name, category, price) { 
    this.name = ko.observable(name); 
    this.category = ko.observable(category); 
    this.price = ko.observable(price); 
    this.priceWithTax = ko.dependentObservable(function() { 
     return (this.price() * 1.05).toFixed(2); 
    }, this); 
} 

//do some basic mapping (without mapping plugin) 
var mappedData = ko.utils.arrayMap(dataFromServer, function(item) { 
    return new Item(item.name, item.category, item.price); 
}); 

EDITAR

he hecho un poco más investigación en el th es y usted PUEDE realmente mapear el objeto de matriz JS con la asignación KO, sin embargo, el objeto después del mapa NO va a ser la matriz observable KO. Será simplemente normal objeto de matriz JS y, para el caso, que pueda datos se unen con KO:

var bd = [ { x: 1, y: "bd test" }, { x: 2, y: "bd test 1dsf" } ]; 

var bdViewModel = ko.mapping.fromJS(bd); 

// 'bdViewModel' is NOT KO Observable Array, so you can't use KO Binding. However, all the properties of 'bdViewModel' (x and y) are KO Observable. 
//ko.applyBindings(bdViewModel, $("#bd").get(0)); 
console.log(bdViewModel()); 

// 'bdViewModel' must be called as function (with open and close parentheses) to see the data. 
$.each(bdViewModel(), function (i, d) { 
    $("#bdList").append("<li>" + d.y() + "</li>"); 
}); 

Aquí está la JSBin para la comparación de los mapas serie JS y JSON: http://jsbin.com/uzuged/5/

+0

No uso el plugin de mapeo funcionado en mi caso. Obtengo una serie de objetos del servidor y quería asignarlos a una matriz observable. Utilicé: self.MyObservArray (ko.utils.arrayMap (arrayfromServer, function (item) { return new BlogObject (item); })); – LKallipo