Сопоставление данных JSON в Knockout observableArray с определенным типом модели представления
Существует ли способ сопоставить объект данных JSON с наблюдаемым массивом, а затем, в свою очередь, инициализировать каждый элемент наблюдаемого массива в определенный тип модели представления?
Я просмотрел всю документацию knockout вместе с примерами knockout и mapping здесь, и я не могу найти никакого ответа, который работает для того, что я ищу.Итак, у меня есть следующие данные 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();
}
Возможно ли это при данной структура данных и использование плагина отображения knockout, чтобы результирующая StateViewModel содержала observableArray, заполненный 2 CityViewModels, и каждая CityViewModel, содержащая observableArray, заполненный 2 StreetViewModels?
В настоящее время с помощью плагина mapping я могу получить его для отображения в StateViewModel, но коллекции "города" и "улицы" заполнены универсальными объектами вместо экземпляров моих моделей City и Street view.
Они заканчивают тем, что правильные наблюдаемые свойства и значения на них, они просто не являются экземплярами моих моделей представления,которые я ищу.
1 ответ:
Проверьте это 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());