嵌套的knockout observableArray中的和值

时间:2013-09-12 09:56:48

标签: javascript jquery knockout.js

我想总结嵌套元素 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 未定义。非常感谢任何援助

1 个答案:

答案 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,那就更好了。

我希望这或多或少是你想要达到的目标。