我想总结嵌套元素 QtyToOrder * VendorPrice 对于基于所选供应商的所有数组元素。
我的嵌套observable数组如下所示:
CheckStock: [{
ItemName: "123",
Vendors: [{
QtyToOrder: "5",
VendorPrice: "1243"}],
SelectedVendor: 0
},{
ItemName: "123",
Vendors: [{
QtyToOrder: "5",
VendorPrice: "1243"},
{
QtyToorder: 9
VendorPrice: 999 }],
SelectedVendor: 0
}]
我创建了一个Fiddle,其中包含我使用的实际数据和我正在使用的ViewModel。而这个功能:
MyDataViewModel.TotalPurchaseReqPrice = ko.computed(function () {
var self = MyDataViewModel;
var tot;
for (var i = 0; i < self.CheckStock().length; i++) {
for (var j = 0; j < self.CheckStock()[i].SelectedVendor() ; j++) {
var HasVal = self.CheckStock()[i].SelectedVendor()[j] ? (ko.toJS(SelectedVendor().QtyToOrder) * ko.toJS(SelectedVendor().VendorPrice)) : 0
tot += HasVal
}
}
return tot;
});
尝试让它工作,但我没有从Viewmodel返回任何值。我也尝试过订阅 SelectedVendor ,但仍然认为 SelectedVendor 未定义。非常感谢任何援助
答案 0 :(得分:4)
好的..让我有一段时间来完成这项工作,但我想我已经实现了你想做的事。
主要问题是您正在创建此属性:
MyDataViewModel.TotalPurchaseReqPrice = ko.computed(function () {}
但这永远不知道何时应该计算。事实上,应该触发更改的属性不在MyDataViewModel
中,它们位于每个CheckStock
对象中。我想你想在任何下拉列表更改时触发重新计算,因此这属于SelectedVendor
对象的属性CheckStock
。
相反,我们可以执行以下操作:
var stock = {
ProductName: element.ProductName,
RequiredComponents: element.RequiredComponents,
StockCode: element.StockCode,
RequiredQtyByBom: element.RequiredQtyByBom,
QtyUnassignedInWarehouse: element.QtyUnassignedInWarehouse,
QtyAllocatedInWarehouse: element.QtyAllocatedInWarehouse,
PCBReference: element.PCBReference,
QtyOnOrder: element.QtyOnOrder,
SelectedVendor: ko.observable(0),
Vendors: ko.mapping.fromJS(element.Vendors),
RequireVendor: element.RequireVendor
};
stock.SelectedVendor.subscribe(subscription, MyDataViewModel);
MyDataViewModel.CheckStock.push(stock);
请注意,在subscribe
函数中,我将delagate传递给触发器并将MyDataViewModel
作为上下文传递。 subscription
变量是计算TotalPurchaseReqPrice
的函数。我在这里做了一些改变,也许这个功能并不是你想要做的事情。我做了一些解释:))
var subscription = function () {
var tot = 0;
for (var i = 0; i < this.CheckStock().length; i++) {
if(this.CheckStock()[i].SelectedVendor()){
tot += this.CheckStock()[i].SelectedVendor().QtyToOrder() * this.CheckStock()[i].SelectedVendor().VendorPrice();
}
}
this.TotalPurchaseReqPrice(tot);
};
我改变了很多代码,如果你选择l ook at this JsFiddle,那就更好了。
我希望这或多或少是你想要达到的目标。