Mappare i dati JSON su Knockout osservableArray con tipo di modello di vista specifico

C’è un modo per mappare un object dati JSON su un array osservabile e poi a turno ogni elemento dell’array osservabile essere inizializzato in uno specifico tipo di modello di vista?

Ho esaminato tutta la documentazione di knockout insieme agli esempi di knockout e mapping qui e non riesco a trovare nessuna risposta che funzioni per quello che sto cercando.

Quindi, ho i seguenti dati JSON:

var data = { state : { name : 'SD', cities : [{ name : 'Sioux Falls', streets : [{ number : 1 }, { number : 3 }] }, { name : 'Rapid City', streets : [{ number : 2 }, { number : 4 }] }] } }; 

E ho i seguenti modelli di vista:

 var StateViewModel = function(){ this.name = ko.observable(); this.cities = ko.observableArray([new CityViewModel()]); } var CityViewModel = function(){ this.name = ko.observable(); this.streets = ko.observableArray([new StreetViewModel()]); } var StreetViewModel = function(){ this.number = ko.observable(); } 

È ansible, con la struttura dati data e utilizzando il plug-in di mapping di knockout, che lo StateViewModel risultante contenga un ObservableArray popolato con 2 CityViewModels e ogni CityViewModel contenente un observableArray popolato con 2 StreetViewModels?

Attualmente utilizzando il plugin di mapping sono in grado di farlo associare a uno StateViewModel, ma le collezioni ‘cities’ e ‘streets’ sono popolate con oggetti generici invece delle istanze dei miei modelli di City e Street view.

Finiscono con le proprietà e i valori osservabili corretti su di loro, non sono solo esempi dei miei modelli di vista, che è quello che sto cercando.

Controlla questo http://jsfiddle.net/pTEbA/268/

 Object.prototype.getName = function() { var funcNameRegex = /function (.{1,})\(/; var results = (funcNameRegex).exec((this).constructor.toString()); return (results && results.length > 1) ? results[1] : ""; }; function StateViewModel(data){ this.name = ko.observable(); ko.mapping.fromJS(data, mapping, this); } function CityViewModel(data) { this.name = ko.observable(); ko.mapping.fromJS(data, mapping, this); } function StreetViewModel(data) { this.name = ko.observable(); ko.mapping.fromJS(data, mapping, this); } var mapping = { 'cities': { create: function(options) { return new CityViewModel(options.data); } }, 'streets': { create: function(options) { return new StreetViewModel(options.data); } } } var data = { state: {name:'SD', cities:[{name:'Sioux Falls',streets:[{number:1},{number:3}]}, {name:'Rapid City',streets:[{number:2},{number:4}]}]}}; var vm = new StateViewModel(data.state) console.log(vm); console.log(vm.getName()); console.log(vm.cities()); console.log(vm.cities()[0].getName()); console.log(vm.cities()[0].streets()); console.log(vm.cities()[0].streets()[0].getName());​