[英]Sum values in nested knockout observableArray
我想對嵌套元素QtyToOrder * VendorPrice求和,以用於基於所選供應商的所有數組元素。
我的嵌套可觀察數組如下所示:
CheckStock: [{
ItemName: "123",
Vendors: [{
QtyToOrder: "5",
VendorPrice: "1243"}],
SelectedVendor: 0
},{
ItemName: "123",
Vendors: [{
QtyToOrder: "5",
VendorPrice: "1243"},
{
QtyToorder: 9
VendorPrice: 999 }],
SelectedVendor: 0
}]
我用我使用的實際數據和我使用的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是未定義的。 任何協助將不勝感激
好的,這使我花了一些時間來完成這項工作,但我想我實現了您想做的事情。
主要問題是您正在創建此屬性:
MyDataViewModel.TotalPurchaseReqPrice = ko.computed(function () {}
但這永遠不知道什么時候應該計算。 實際上,應該觸發更改的屬性不在MyDataViewModel
,而在每個CheckStock
對象中。 我想您想在任何下拉列表更改發生時觸發重新計算,因此這屬於CheckStock
對象的屬性SelectedVendor
。
因此,我們可以執行以下操作:
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
函數中,我將延遲數據傳遞給觸發器,並將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);
};
我更改了很多代碼,如果您對本JsFiddle有所了解,那就更好了 。
我希望這或多或少是您想要實現的目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.