带有关联JSON对象的ko.utils.arrayMap

时间:2013-10-25 12:16:52

标签: javascript knockout.js

我正在尝试使用ko.utils.arrayMap()循环关联的JSON对象,但是当以这种方式完成时,该函数永远不会进入循环。任何人都可以建议我如何获得这些属性。可能我对这种JSON使用了错误的实用函数?

http://jsfiddle.net/rVPBz/

var data = [
   {
      "job_id":"AM28200",
      "inspection":{
         "5":{
            "inspection_type_id":5,
            "inspection_type_name":"hydro",
            "display_name":"Requested",
            "html_name":"Hydro",
            "itp":"Stage H1. H2, H3",
            "1":{
               "dates":[
                  "2013-10-21"
               ],
               "inspectors":[
                  " "
               ]
            },
            "2":{
               "dates":[
                  "2013-10-21"
               ],
               "inspectors":[
                  " "
               ]
            },
            "3":{
               "dates":[
                  "2013-10-21"
               ],
               "inspectors":[
                  " "
               ]
            },
            "4":{
               "dates":[
                  "2013-10-21"
               ],
               "inspectors":[
                  " "
               ]
            },
            "5":{
               "dates":[
                  "2013-10-21"
               ],
               "inspectors":[
                  " "
               ]
            }
         }
      }
   },
   {
      "job_id":"AM28212",
      "inspection":{
         "5":{
            "inspection_type_id":5,
            "inspection_type_name":"hydro",
            "display_name":"Waived",
            "html_name":"Hydro",
            "itp":"Stage H1. H2, H3",
            "1":{
               "dates":[
                  "2013-10-21"
               ],
               "inspectors":[
                  " "
               ]
            }
         }
      }
   }
]

var InspectionDiary = function() {
    var self = this;
    self.jobs = ko.observableArray([])

    function Job(data){
        var self = this;
        self.job_id = data.job_id;
        self.types = ko.observableArray([])
    }

    function Type(data){
        var self = this;
        self.type_id = ko.observable(data.inspection_type_id);
        self.name = ko.observable(data.inspection_type_name);
        self.display_name = ko.observable(data.display_name);
        self.html_name = ko.observable(data.html_name);
        self.itp = ko.observable(data.itp);
        self.inspectors = ko.observableArray([])
        self.dates = ko.observableArray([]);
    }

    var jobs = ko.utils.arrayMap(data, function(item) {
        var job = new Job(item);
        var types = ko.utils.arrayMap(item.inspection, function(item) {
            var type = new Type(item)
            type.dates = ko.utils.arrayMap(item.dates(), function(item) {
                return new Dates(item);
            })
            type.inspectors = ko.utils.arrayMap(type.inspectors(), function(item) {
                return new Inspector(item);
            })
            return type;
        })
        job.types(types);
        return job;
    });
    self.jobs(jobs);
}

 ko.applyBindings(new InspectionDiary())

2 个答案:

答案 0 :(得分:3)

ko.utils.arrayMap设计用于数组,而不是对象。

要遍历对象,您可以使用以下函数:

var objectMap = function(o, handler){
    var res = {};
    for(var key in o) {
       res[key] = handler(o[key])
    }
    return res;
};

正如mapping doc所说:

ko.utils.arrayMap,它为数组中的每个项执行一个函数,并将函数的结果推送到返回的新数组。

See fiddle

答案 1 :(得分:1)

问题是json在适当的位置不包含数组。例如,检查应该是一个数组,而不是。由于看起来你没有在viewModels中做很多额外的事情,你可以试试这个从JSON到VM的更简单的映射:http://knockoutjs.com/documentation/plugins-mapping.html