违规行为:
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()" />
我需要在添加违规后立即自动更新。
感谢。
答案 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()
。
如果它是来自用户的输入,则它将是一个字符串,因此您需要使用parseInt或parseFloat将其转换为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);
});
现在它似乎注意到了一个变化。