看到工作的jsfiddle:http://jsfiddle.net/ruslans/vFK82/淘汰赛的循环依赖计算
我有3个领域:净价(前含税),纳税额和总价格(价格不含税+税额。)。 NetPrice和Total是可写的,即您可以更改其中任何一个,而其他2个值必须自动计算。
我这样做的方式是使用3个可观察的和2个计算的敲除对象,但我认为也许有人知道Knockout好得多可以提出一个更有效的方法来实现这一点。
HTML:
Net Price:
<input type="textbox" data-bind="value: NetPriceCalc" />
<br />Tax Amount:
<label data-bind="html: TaxAmt"></label>
<br />Total:
<input type="textbox" data-bind="value: TotalCalc" />
脚本:
var viewModel = {
NetPrice: ko.observable(100),
TaxAmt: ko.observable(20),
Total: ko.observable(120),
TaxRate: 0.2
};
viewModel.updateTaxAmt = function (useNetPrice) {
if (useNetPrice) {
return this.TaxAmt(this.NetPrice() * this.TaxRate);
} else {
var total = Number(this.Total());
var taxAmt = total - total/(1 + this.TaxRate);
return this.TaxAmt(taxAmt);
}
};
viewModel.updateNetPrice = function() {
this.NetPrice(Number(this.Total()) - Number(this.TaxAmt()));
};
viewModel.updateTotal = function() {
this.Total(Number(this.NetPrice()) + Number(this.TaxAmt()));
};
viewModel.NetPriceCalc = ko.computed({
read: function() {
console.log("NetPriceCalc read");
return viewModel.NetPrice();
},
write: function (value) {
console.log("NetPriceCalc write");
viewModel.NetPrice(value);
viewModel.updateTaxAmt(true);
return viewModel.updateTotal();
}
});
viewModel.TotalCalc = ko.computed({
read: function() {
console.log("TotalCalc read");
return viewModel.Total();
},
write: function (value) {
console.log("TotalCalc write");
viewModel.Total(value);
viewModel.updateTaxAmt(false);
return viewModel.updateNetPrice();
}
});
ko.applyBindings(viewModel);
优秀!谢谢 – Tsar 2013-04-15 08:10:38
很酷。使他们在每次击键更新“afterkeydown''到字段的数据绑定属性:您可以添加'valueUpdate。 – 2013-11-11 10:30:09