有没有一种方法可以将JSON数据对象映射到可观察数组,然后又将可观察数组的每一项初始化为特定类型的视图模型?
我已经在这里查看了所有敲除的文档以及敲除和映射示例,但找不到适合我所追求的答案。
因此,我有以下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包含由2个CityViewModel填充的observableArray,而每个CityViewModel包含由2个StreetViewModels填充的observableArray?
目前,我可以使用映射插件将其映射到StateViewModel,但是“城市”和“街道”集合中填充了通用对象,而不是我的城市和街景视图模型的实例。
它们最终带有正确的可观察属性和值,它们不是我所遵循的视图模型的实例。
检查此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());