Knockout Mapping插件不适用于嵌套对象

时间:2014-08-22 04:02:54

标签: knockout.js knockout-mapping-plugin

我从服务器获取了以下JSON数据。

var viewModel=
{ 
    InvoiceOrderID:55
    orderItem :{
        OrderItemID:32
        ProductCode:45
        Name: ZipZapper
    }   
}

我在此viewModel数据上使用了ko.mappingfromJSko.mappingfromJS(viewModel,{},self)

ko.applyBindings(self)是否生成了绑定

如何数据绑定内部嵌套对象的ProductCode

orderItem().ProductCode不起作用

2 个答案:

答案 0 :(得分:0)

你可以使用knockout mapping plugin创建函数来告诉你如何在这里映射你的整个树,虽然我怀疑你会想要一个视图模型来表示OrderItem。

var OrderItemViewModel = {
   OrderItemId: ko.observable();
   ProductCode: ko.observable();
   Name: ko.observable()
}

var mapping = {
    'orderItem' : {
        create: function(data){
            return new OrderItemViewModel(data);
        }
    }
}

var viewModel = ko.mapping.fromJS(data, mapping);

答案 1 :(得分:0)

正如@tizzy所指出的那样,knockout mapping不会以这种方式工作 - 默认情况下它将属性转换为observables和数组转换为observableArrays,但嵌套对象未转换(尽管它们的内在属性也转换为可观察的。)

因此,对于您的特定声明,您的ViewModel应如下所示:

function ViewModel(data) {
    var mapping = {
        'orderItem': {
            create: function(options) {
                return ko.observable(options.data);
            }
        }
    }
    ko.mapping.fromJS(data, mapping, this);
}

请参阅demo