Knockout.js 对从另一个ObserverArray创建的ObserverArray的绑定

Knockout.js 对从另一个ObserverArray创建的ObserverArray的绑定,knockout.js,Knockout.js,我有一个从ajax调用返回的对象,我想根据用户的输入对该对象进行一些计算。输入为数字输入,并选中复选框以在计算中是否包含另一个数字 我的JS是: var viewModel = function() { var self = this; self.currentVal = ko.observable(2); self.includeTax = ko.observable(false); self.sales = ko.observableArray([]

我有一个从ajax调用返回的对象,我想根据用户的输入对该对象进行一些计算。输入为数字输入,并选中复选框以在计算中是否包含另一个数字

我的JS是:

var viewModel = function() 
{
        var self = this;
    self.currentVal = ko.observable(2);
    self.includeTax = ko.observable(false);
    self.sales = ko.observableArray([]);
    self.computedSales = ko.observableArray([]);

self.sales([
    {"ProductID": "10121a", "Cost": 110, "Quantity": 6, "X": 9034.25, "Other": 23, "Date": 2017-05-5}, 
    {"ProductID": "10122b", "Cost": 10, "Quantity": 18, "X": 152.99, "Other": 20, "Date": 2017-05-3},
    {"ProductID": "10123c", "Cost": 1000, "Quantity": 2, "X": 99.50, "Other": 5, "Date": 2017-05-1}]);

self.computeSales = function() {
    ko.utils.arrayForEach(self.sales(), function (item) {
    self.computedSales().push({
        "ProductID": item.ProductID, 
      "Total": item.Cost * item.Quantity,
      // "Total" is needed for the Calc value, is there a way to re-use the Total without having to duplicate it below?:
      // "Calc": item.Cost * item.Quantity * (self.currentVal / 100)
      "Calc": self.includeTax() == true ? (item.Cost * item.Quantity * (2 / 100) * .5) : (item.Cost * item.Quantity * 2 / 100)
      });

      //alert(self.computedSales()[self.computedSales().length -1].Total);
  });
  // self.currentVal not correct:
  //alert(self.currentVal);
};
self.computeSales();
};

$(function () {
    ko.applyBindings(new viewModel());
});
当我勾选复选框或更改输入中的值时,
Calc
列不会更改-我做错了什么

我的主要目的是找到一种方法来重复使用一些属性,比如Total,而不是重复
item.Cost*item.Quantity
,但我想这是另一个独立的问题


感谢您的帮助

我认为如果您的销售对象实际上是强类型对象,您可以将计算结果附加到该对象,那么这将更容易。首先,您应该为您的销售创建一个对象:

var sale = function(item) {
    var thisSale = this;
    thisSale.productId = ko.observable(item.ProductID);
    thisSale.cost = ko.observable(item.Cost);
    thisSale.quantity = ko.observable(item.Quantity);
    //etc with all properties needed.
    thisSale.calc = ko.pureComputed(function() {
        return self.includeTax() == true ? (thisSale.Cost * thisSale.Quantity * (2 / 100) * .5) : (thisSale.Cost * thisSale.Quantity * 2 / 100)
    });
}
然后使用数据创建这些对象:

self.computeSales = function() {
    ko.utils.arrayForEach(self.sales(), function (item) {
        self.computedSales().push({
            new sale(item);
        });
    });
};

计算值将在其引用的可观察对象更新时更新,因此通过将计算值设置为计算值,您应该能够在更改复选框时更新计算值。抱歉,如果这不是很清楚,我还没有测试这段代码,所以你可能需要调整它,但一般原则应该在那里

我认为如果您的销售对象实际上是强类型对象,您可以将计算结果附加到该对象,那么这将更容易。首先,您应该为您的销售创建一个对象:

var sale = function(item) {
    var thisSale = this;
    thisSale.productId = ko.observable(item.ProductID);
    thisSale.cost = ko.observable(item.Cost);
    thisSale.quantity = ko.observable(item.Quantity);
    //etc with all properties needed.
    thisSale.calc = ko.pureComputed(function() {
        return self.includeTax() == true ? (thisSale.Cost * thisSale.Quantity * (2 / 100) * .5) : (thisSale.Cost * thisSale.Quantity * 2 / 100)
    });
}
然后使用数据创建这些对象:

self.computeSales = function() {
    ko.utils.arrayForEach(self.sales(), function (item) {
        self.computedSales().push({
            new sale(item);
        });
    });
};
计算值将在其引用的可观察对象更新时更新,因此通过将计算值设置为计算值,您应该能够在更改复选框时更新计算值。抱歉,如果这不是很清楚,我还没有测试这段代码,所以你可能需要调整它,但一般原则应该在那里