2

我想对基于所选供应商的所有数组元素的嵌套元素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创建了一个Fiddle 。这个功能:

 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未定义。任何协助将不胜感激

4

1 回答 1

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);
    };     

我更改了很多代码,所以如果你看看这个 JsFiddle会更好。

我希望这或多或少是您想要实现的目标。

于 2013-09-12T12:09:56.453 回答