2012-06-06 9 views
16

Quiero construir un cliente para mi servicio REST usando Knockout.js. Tengo muchos repositorios al que quiero acceder a través de diferentes URL, así que se me ocurrió esta solución usando Revealing-Prototype-Pattern. Mi problema : No puedo encontrar la forma de mapear la propiedad Items con mis "datos" que recibo de mi servicio.Knockout.js mapeando un JSON en un array observable

var Repository = function (url) { 
    this.Url = url; 
    this.Items = ko.observableArray([]); 
    this.PendingItems = ko.observableArray([]); 
}; 

Repository.prototype = function() { 
    var 
     getAllItems = function() { 
      var self = this; 
      $.getJSON(self.Url, function (data) { 
      // data=[{"Id":1,"Name":"Thomas","LastName":"Deutsch"},{"Id":2,"Name":"Julia","LastName":"Baumeistör"}] 
       ko.mapping.fromJS(data, self.Items); 
      }); 
     }, 
    ... 


// i call it like this: 
customerRepository = new Repository('http://localhost:9200/Customer'); 
customerRepository.getAllItems(); 

Creo que el problema está en esto: ko.mapping.fromJS (datos, self.Items); pero no puedo encontrar la manera correcta de hacerlo.
Pregunta: ¿Qué estoy haciendo mal? He encontrado un ejemplo - y están haciendo lo mismo, creo: http://jsfiddle.net/jearles/CGh9b/

Respuesta

28

Creo que la versión de dos argumentos de fromJS solo se usa para objetos que se mapearon previamente, es decir, que tenían un objeto de opciones de asignación vacío implícito. Dado que su mapeo es la primera vez que se ha ejecutado, necesita proporcionar ese objeto de opciones vacías de esa manera.

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

http://jsfiddle.net/madcapnmckay/j7Qxh/1/

Espero que esto ayude.

+1

Para referencia de todos, el literal de objeto medio vacío en este ejemplo es un marcador de posición vacío para el objeto de opciones de asignación. – pimbrouwers

Cuestiones relacionadas