将JSON数据映射到具有特定视图模型types的Knockout observableArray

有没有办法将一个JSON数据对象映射到可观察数组,然后将每个可观察数组的项都初始化为特定types的视图模型?

我已经看了所有的淘汰赛的文件,以及淘汰赛和映射的例子在这里,我找不到任何答案适用于我后。

所以,我有以下的JSON数据:

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

我有以下观点模型:

 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(); } 

是否有可能,与给定的数据结构,并使用挖空的映射插件,得到的StateViewModel包含一个observableArray填充2 CityViewModel,每个CityViewModel包含一个observableArray填充2个StreetViewModels?

目前使用的映射插件,我能够得到它映射到一个StateViewModel,但“城市”和“街道”集合填充generics对象,而不是我的城市和街景视图模型的实例。

他们最终得到了正确的可观察的属性和值,它们不是我观察模型的实例,这就是我所追求的。

检查这个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());​