淘汰不自动更新计算值

时间:2015-01-11 23:50:45

标签: knockout.js

违规行为:

function Violation(violCd, desc, amt) {
        this.violCd = ko.observable(violCd);
        this.desc = ko.observable(desc);
        this.amtToPay = ko.observable(amt);
    }

查看型号:

 self.violations = ko.observableArray([]);

 self.addViol = function () {
      alert('adding');
      self.violations.push(new Violation({ violCd: "28-0000", desc: "DUI OR SOMETHING",
     amtToPay: "300" }));
}
self.total = ko.computed(function () {
      alert(total);
      var total = 0;
      for (var i = 0; i < self.violations.length; i++) {
           total += self.violations[i].amtToPay;
      }
      return total;
});

html是:

<input data-bind="value: total()" />

我需要在添加违规后立即自动更新。

感谢。

2 个答案:

答案 0 :(得分:1)

所以主要问题与self.violations有关。这需要声明为observablearray,这样如果添加了项目,那么knockout知道它们已被添加并且可以更新计算的总数。

self.violations = ko.observableArray();

然后,当您访问数组以获取内容时,您需要使用self.violations(),因此您的计算函数应为:

self.total = ko.computed(function () {
      alert(total);
      var total = 0;
      for (var i = 0; i < self.violations().length; i++) {
           total += self.violations()[i].amtToPay;
      }
      return total;
});

另一个问题是amtToPay设置为字符串,因此在javascript 0 + "300" = "0300"中。它应该设置为int或float:

self.violations.push(new Violation({ violCd: "28-0000", desc: "DUI OR SOMETHING",
     amtToPay: 300 }));

如果可以在不修改数组的情况下修改属性的值,则可能还必须使Violation中的属性成为可观察的。

例如:

self.violations()[0].amtToPay = 300;

这种变化不会被淘汰赛注意到,所以你需要宣布amtToPay是一个可观察的:

self.amtToPay = ko.observable();

然后要访问您需要使用的值self.violations[i]().amtToPay()

如果它是来自用户的输入,则它将是一个字符串,因此您需要使用parseIntparseFloat将其转换为int或float。

答案 1 :(得分:0)

我用它修复了它:

        self.violations = ko.observableArray([]);

        self.addViol = function () {

            self.violations.push(new violation({ violCd: "28-0000", desc: "DUI OR SOMETHING", amt: "300" }));
            self.violations.valueHasMutated();

        }
        self.total = ko.computed(function () {
            var total = 0;
            ko.utils.arrayForEach(self.violations(), function (violation) {
                var value = parseFloat(violation.amt());
                if (!isNaN(value)) {
                    total += value;
                }
            });
            return total.toFixed(2);
        });

现在它似乎注意到了一个变化。