json - 将 JSON 数据映射到具有特定 View 模型类型的 Knockout observableArray

标签 json knockout.js knockout-mapping-plugin

有没有办法将 JSON 数据对象映射到可观察数组,然后依次将可观察数组的每个项目初始化为特定类型的 View 模型?

我查看了所有 knockout 的文档以及此处的 knockout 和映射示例,但找不到任何适合我所追求的答案。

所以,我有以下 JSON 数据:

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

我有以下 View 模型:

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 包含一个填充有 2 个 CityViewModel 的 observableArray,并且每个 CityViewModel 包含一个填充有 2 个 StreetViewModel 的 observableArray?

目前使用映射插件,我能够将其映射到 StateViewModel,但“城市”和“街道”集合填充了通用对象,而不是我的城市和街景模型的实例。

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

最佳答案

查看 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());
​

关于json - 将 JSON 数据映射到具有特定 View 模型类型的 Knockout observableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9951521/

相关文章:

javascript - clang 格式化一个 json 文件

ruby - 自动将 JSON 对象映射到 Ruby 中的实例变量

javascript - 如何取回由 knockout 映射绑定(bind)的 knockout 可观察对象

javascript - 在 knockout.js 中从 JSON 数组中获取所有键

json - 读/写本地 json 文件 swift 4

android - 使用 JSON 通过 Android 访问 .NET Web 服务

javascript - 妥善处理浏览器资源

javascript - 使用 Knockout 克隆具有可观察数组的对象

javascript - KnockoutJS 中的 subview 模型在 Internet Explorer 8 中引发异常

knockout.js - ko.mapping创建函数,扩展对象