1

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())
4

2 に答える 2

2

ko.utils.arrayMap は、オブジェクトではなく配列で使用するように設計されています。

オブジェクトをループするには、次の関数を使用できます。

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

マッピングドキュメントが言うように:

ko.utils.arrayMap は、配列内の各項目に対して関数を実行し、関数の結果を返された新しい配列にプッシュします

フィドルを見る

于 2013-10-25T12:51:13.613 に答える
1

問題は、json の適切な場所に配列が含まれていないことです。たとえば、検査は配列である必要がありますが、そうではありません。viewModels で多くの余分なことをしていないように見えるので、JSON から VM へのより簡単なマッピングのためにこれを試すことができます: http://knockoutjs.com/documentation/plugins-mapping.html

于 2013-10-25T12:40:21.837 に答える