knockoutjs使用嵌套数组映射自定义对象

时间:2013-04-18 15:43:23

标签: javascript knockout.js knockout-mapping-plugin knockout-2.0

我想将此json映射到自定义对象。 问题是项目不是Itemof对象而是普通对象。 我在这里失踪了什么?

您可以在此处测试:http://jsfiddle.net/5jhpE/

var json = [
    {
        id: 1,
        items: [
            {id: 1, name: 'item1'},
            {id: 2, name: 'item2'},
            {id: 3, name: 'item3'}
        ]
    },
    {
        id: 2,
        items: [
            {id: 4, name: 'item4'},
            {id: 5, name: 'item5'},
            {id: 6, name: 'item6'}
        ]
    },
]

function Data(data) {
    ko.mapping.fromJS(data, {}, this);
}

function Item(data) {
    ko.mapping.fromJS(data, {}, this);
}
var map = {
    create: function(options) {
        return new Data(options.data);
    },
    items: function(options) {
        return new Item(options.data);
    },
}

var res = ko.mapping.fromJS(json, map);

输出:

console.log(res());
[Data, Data]
--
console.log(res()[0].items());
[Object, Object, Object] <-- Here I want to have [Item, Item, Item]

2 个答案:

答案 0 :(得分:5)

我已经用这种方式改变了你的映射器选项

var map = {
    'items': {
        create: function(options) {
            return new Item(options.data);
        }
    }
}

看起来很好; 你能试试吗?

如果您需要:jsfiddle 控制台输出是 [Item,Item,Item] ,如你所愿;


我允许添加一个小建议:如果你需要以这种方式测试typeof:

typeof res()[0].items()[0]
注意,这可能很棘手!

为了避免任何问题,我通常以这种方式声明Item viewModel:

function Item(data) {
    var self = this;
    self.myType = 'item';
    ko.mapping.fromJS(data, {}, this);
}

所以你可以简单地测试一下,例如:

if('item' === res()[0].items()[0].myType) {
  //do something...
}

这个“myType”技巧是在一段时间之前在stackoverflow中建议的:我会在这里发布链接,我会找到帖子

答案 1 :(得分:2)

看看这个问题:Map JSON data to Knockout observableArray with specific view model type

它映射自定义嵌套对象,并且还包含一个这样做的小提琴。