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修改视图模型以将可观察的声明和值的初始化与参数分开-如果没有指定参数怎么办?我的建议是,在现有函数的末尾有一个新的内部函数。一个从外部函数传递所有参数的生命就是我所做的,它在将每个参数分配给可观察对象之前检查每个参数。最后,你有没有尝试过简单地单步完成你的脚本?