簡體   English   中英

嵌套的剔除observableArray中的總和值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM