Knockout.js映射插件,访问json嵌套的多个级别

时间:2013-05-02 21:33:34

标签: jquery knockout.js

Knockout.js Mapping插件是否可以访问json嵌套数据,还是只能找到第一级数据?

如果映射插件无法访问嵌套数据还有其他解决方案吗?

在我的示例中,“Number”正确映射但“DueDate”不会映射。

// json with nested data
{
   "Level1":[
      {
         "Level2":{
            "DueDate":"\/Date(1362124800000)\/",
            },
         "Number":5499
      },
}

// Here's my data model - I need to map the "DueDate" observable.
var viewModel;
$.getJSON('/myJsonData', function (data) {
    viewModel = ko.mapping.fromJS(data);
    ko.applyBindings(viewModel);
});

2 个答案:

答案 0 :(得分:1)

我使用了自己种植的单向递归映射函数。它对我来说效果很好,而且很小。

function convertToObservable(obj) {
    var newObj = {},
        key,
        value;

    if (!$.isPlainObject(obj)) {
        return obj;
    }

    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            value = obj[key];
            // console.log(key + ':', value);
            newObj[key] = $.isArray(value)
                ? ko.observableArray($.map(value, convertToObservable))
                : $.isPlainObject(value) ? convertToObservable(value) : ko.observable(value);
        }
    }
    return newObj;
}

它依赖于jQuery,但如果不使用jQuery则可以重写。

答案 1 :(得分:1)

您确定无法访问DueDate吗? 因为在fiddle我可以。

// json nested data
var data = {
    "Level1": [{
        "Level2": {
            "DueDate": "\/Date(1362124800000)\/",
        },
            "Number": 5499
    }]
};
var viewModel = ko.mapping.fromJS(data);
ko.applyBindings(viewModel);

var dueDate = viewModel.Level1()[0].Level2.DueDate;

alert(typeof dueDate);