1

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);
});
4

2 回答 2

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,可以重写。

于 2013-05-02T21:51:43.213 回答
1

您确定无法访问 DueDate 吗?因为在我的小提琴中我可以。

// 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);
于 2013-05-02T21:53:44.323 回答