【发布时间】:2013-09-01 09:22:42
【问题描述】:
我想根据 JSON 有效负载中的项目是否需要供应商,将供应商列表嵌套到我从服务器获取的现有 JSON 有效负载中。
我想要的结果是这样的:
{
"ProductName": "Product123",
"RequiredComponents": "CAP 10% H/Vol",
"StockCode": "142111411",
"RequiredQtyByBom": 4,
"QtyUnassignedInWarehouse": 0,
"QtyAllocatedInWarehouse": 40,
"PCBReference": "442C",
"QtyOnOrder": 26,
"Vendors": [],
"RequireVendor": false
},
{
"ProductName": "Product123",
"RequiredComponents": "Screws",
"StockCode": "Screws",
"RequiredQtyByBom": 1,
"QtyUnassignedInWarehouse": 0,
"QtyAllocatedInWarehouse": 14,
"PCBReference": "Screws",
"QtyOnOrder": 26,
"Vendors": [
{"VendorID": "3",
"VendorName": "ABC Supplier",
"VendorMOQ": 50000,
"VendorItemPrice": 322},
{"VendorID": "4",
"VendorName": "DEF Supplier",
"VendorMOQ": 4,
"VendorItemPrice": 120}
],
"RequireVendor": true
},
{
"ProductName": "Product123",
"RequiredComponents": "14141415",
"StockCode": "151555231",
"RequiredQtyByBom": 1,
"QtyUnassignedInWarehouse": 0,
"QtyAllocatedInWarehouse": 170,
"PCBReference": "1414",
"QtyOnOrder": 26,
"Vendors": [],
"RequireVendor": false
}
我正在考虑使用 2 个 AJAX 调用来将值推送到 Observable 数组中。
AJAX 调用 1:为产品创建初始负载
MyDataViewModel.SelectedOrderID.subscribe = ko.computed(function () {
$.ajax({
url: "/URLToMethod/GetBomStockByProductID",
data: { OrderID: ko.toJS(MyDataViewModel.SelectedOrderID) },
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "JSON",
timeout: 10000,
success: function (Result) {
for (var i = 0; i < Result.d.length; i++) {
element = Result.d[i];
MyDataViewModel.CheckStock.push({
ProductName: element.ProductName, RequiredComponents: element.RequiredComponents, StockCode: element.StockCode, RequiredQtyByBom: element.RequiredQtyByBom, QtyUnassignedInWarehouse: element.QtyUnassignedInWarehouse, QtyAllocatedInWarehouse: element.QtyAllocatedInWarehouse, PCBReference: element.PCBReference, QtyOnOrder: element.QtyOnOrder, Vendors: ko.observableArray(), RequireVendor: ko.computed(function () {
if ((element.RequiredQtyByBom * element.QtyOnOrder) > element.QtyAllocatedInWarehouse) {
return true
} else {
return false
}
})
}
);
}
},
error: function (xhr, status) {
alert(status + " - " + xhr.responseText);
}
});
});
AJAX 调用 2:将值推送到供应商 ko.observableArray() 在第一个有效负载中创建
MyDataViewModel.PurchaseReqHasVendorDetails = ko.computed(function () {
var self = MyDataViewModel;
for (var i = 0; i < self.CheckStock().length; i++) {
if (self.CheckStock()[i].RequirePO()) {
$.ajax({
url: "/URLToMethod/GetVendorsByProductName",
data: { ProductName: self.CheckStock()[i].ProductName },
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "JSON",
timeout: 10000,
success: function (Result) {
for (var i = 0; i < Result.d.length; i++) {
element = Result.d[i];
self.CheckStock()[i].Vendors.push({ VendorID: element.VendorID, VendorName: element.VendorName, VendorMOQ: element.VendorMOQ, VendorPrice: element.VendorPrice });
}
},
error: function (xhr, status) {
alert(status + " - " + xhr.responseText);
}
});
return true;
} else {
return false;
}
}
});
但这不起作用。它创建了初始有效负载,但没有获得第二个有效负载并将其推送到我创建的 observableArray 中。
任何建议将不胜感激
【问题讨论】:
-
您想将其拆分为两个单独的 Ajax 调用的任何特殊原因?另外:你看过映射插件了吗?这似乎非常适合您的场景。
-
@Jeroen 没有具体的理由让我将它们拆分为 2 个 ajax 调用,我基本上只是希望基于 if
RequireVendor == 'true'填充可观察数组(供应商)。我见过映射插件,但从未实际使用过,我该怎么做呢? -
映射插件很棒恕我直言。 relevant documenation page 非常易读且切中要害,还解释了如何映射嵌套数组以及使用键映射从/向您的服务调用进行更新。
-
@Jeroen 你能添加一个如何实现这种嵌套的任意示例,将标记为答案。感谢您的帮助,您的先生!是书生君子!!
标签: jquery ajax json knockout.js ko.observablearray