Javascript 使用敲除js加载嵌套JSON数组

Javascript 使用敲除js加载嵌套JSON数组,javascript,json,knockout.js,Javascript,Json,Knockout.js,我正在尝试加载一个表单,以便从数据库中更新现有数据。 我的对象内部有一个嵌套数组,该数组中的每个元素也有一个嵌套数组。 它看起来如下所示 { "Id": 13, "Name": "Category 1", "DeliveryOptions": [ { "Id": 15, "DeliveryCategoryId": 13, "Name": "Option 1.-1",

我正在尝试加载一个表单,以便从数据库中更新现有数据。 我的对象内部有一个嵌套数组,该数组中的每个元素也有一个嵌套数组。 它看起来如下所示

{
    "Id": 13,
    "Name": "Category 1",
    "DeliveryOptions":
    [
        {
            "Id": 15,
            "DeliveryCategoryId": 13,
            "Name": "Option 1.-1",
            "DeliveryBreakPoints":
            [
                {
                    "Id": 19,
                    "DeliveryOptionId": 15,
                    "Start": 0,
                    "End": 10,
                    "Flat": 1,
                    "Variable": 2,
                    "Delete": false
                }
            ]
        },
        {
            "Id": 16,
            "DeliveryCategoryId": 13,
            "Name": "Option1-2",
            "DeliveryBreakPoints":
            [
                {
                    "Id": 20,
                    "DeliveryOptionId": 16,
                    "Start": 0,
                    "End": null,
                    "Flat": 1,
                    "Variable": 3,
                    "Delete": false
                }
            ]
        }
    ]
}
    function DeliveryCategory(id, name, options) {
        this.Id = id;
        this.Name = name;
        this.DeliveryOptions = ko.observableArray(options);
    }

    function DeliveryOption(id, name, breakpoint) {
        bpIdCounter = 0;
        this.Id = id;
        this.Name = name;
        this.DeliveryBreakPoints = ko.observableArray(breakpoint);

        this.addDeliveryBreakPoint = function (option) {
            option.DeliveryBreakPoints.push(new DeliveryBreakPoint(bpIdCounter++));
        }
    }

    function DeliveryBreakPoint(id, start, end, flat, variable) {
        var self = this;
        self.Id = id;
        self.Start = start;
        self.End = end;
        self.Flat = flat;
        self.Variable = variable;
    }
您可以看到在对象内部有一个名为DeliveryOptions的数组,每个DeliveryOptions数组都有另一个名为DeliveryBreakPoints的数组

我已经将knockout js模型配置如下

{
    "Id": 13,
    "Name": "Category 1",
    "DeliveryOptions":
    [
        {
            "Id": 15,
            "DeliveryCategoryId": 13,
            "Name": "Option 1.-1",
            "DeliveryBreakPoints":
            [
                {
                    "Id": 19,
                    "DeliveryOptionId": 15,
                    "Start": 0,
                    "End": 10,
                    "Flat": 1,
                    "Variable": 2,
                    "Delete": false
                }
            ]
        },
        {
            "Id": 16,
            "DeliveryCategoryId": 13,
            "Name": "Option1-2",
            "DeliveryBreakPoints":
            [
                {
                    "Id": 20,
                    "DeliveryOptionId": 16,
                    "Start": 0,
                    "End": null,
                    "Flat": 1,
                    "Variable": 3,
                    "Delete": false
                }
            ]
        }
    ]
}
    function DeliveryCategory(id, name, options) {
        this.Id = id;
        this.Name = name;
        this.DeliveryOptions = ko.observableArray(options);
    }

    function DeliveryOption(id, name, breakpoint) {
        bpIdCounter = 0;
        this.Id = id;
        this.Name = name;
        this.DeliveryBreakPoints = ko.observableArray(breakpoint);

        this.addDeliveryBreakPoint = function (option) {
            option.DeliveryBreakPoints.push(new DeliveryBreakPoint(bpIdCounter++));
        }
    }

    function DeliveryBreakPoint(id, start, end, flat, variable) {
        var self = this;
        self.Id = id;
        self.Start = start;
        self.End = end;
        self.Flat = flat;
        self.Variable = variable;
    }
我正在传递id和名称等参数。。。因为此代码也用于创建新对象。。但是,我不确定这是否会阻止它绑定现有模型。 我还创建了一个视图模型,如下所示

function DeliveryCategoryViewModel(model) {
    var self = this;
    if (model.Id > 0) {
        self.DeliveryCategory = ko.observable(model);
    } else {
        self.DeliveryCategory = ko.observable(new DeliveryCategory(null, "", [new DeliveryOption(null, "")]));
    }

    self.addDeliveryOption = function () {
        self.DeliveryCategory().DeliveryOptions.push(new DeliveryOption(null, "", [new DeliveryBreakPoint(null,"0","","","","")]));
    }

    self.removeDeliveryOption = function (option) {
        self.DeliveryCategory().DeliveryOptions.remove(option);
    }

    self.removeDeliveryBreakPoint = function (option, breakPoint) {
        option.DeliveryBreakPoints.remove(breakPoint);
    }

    self.onSubmit = function () {

        $.ajax({
            url: "CreateDeliveryCategory",
            type: "POST",
            data: ko.toJSON(self),
            async: true,
            contentType: "application/json"
        }).success(function (data) {
            window.location = data;
        }).error(function(error){
            alert(error);
        })


    }

}
当我从头开始创建一个新的交货类别时,也会用到这段代码,这就是为什么要检查model.Id>0。如果model.id>0,则不绑定模型。它仅正确显示交货类别名称和第一个交货选项名称,即使有两个交货选项,其余的都已损坏


有人能指出发生了什么吗?

你能把你的问题处理一下吗?或者至少告诉我们您是如何加载数据的,以及您是如何设置视图的。在JS的第二块第6行中,您创建了一个DeliveryOption的新实例,该实例只包含两个参数,而不是一个数组。但是在TeleVelyOp选项函数中,您不考虑这个属性的空值——尽管您可以将NULL发送到EnababReLayx中,但是您有一个可能将值推送到这个不存在的可观察数组中的函数。在第10行的new DeliveryBreakPoint调用中还有一个额外的参数,不过这不会引起问题。我有两个建议:1确保model.Id为int。2修改视图模型以将可观察的声明和值的初始化与参数分开-如果没有指定参数怎么办?我的建议是,在现有函数的末尾有一个新的内部函数。一个从外部函数传递所有参数的生命就是我所做的,它在将每个参数分配给可观察对象之前检查每个参数。最后,你有没有尝试过简单地单步完成你的脚本?