KnockoutJs计算出不能使用上一个计算字段

时间:2013-12-14 03:16:19

标签: knockout.js

我有字段A = A1 + A2

字段B = B1 + B2

字段C= A + B

当我更改A1, A2, B1, B2时 A,B,C正常工作。

我尝试手动更改值字段A或字段B然后希望字段C = A + B但不是:(。为什么?以及如何修复? 请帮我!非常感谢你!

这是我的问题: http://jsfiddle.net/leoitviet/X8v6h/5/

2 个答案:

答案 0 :(得分:1)

您的变量可以是ko.observable(“”)或ko.computed。但不可能两者兼而有之。当您更改A或B时,不会被观察到。因此,C的值没有变化。当您更改A1,A2,B1,B2时,它会更改A,B和C的值。这是预期的行为。

答案 1 :(得分:1)

这里是jsfidle,注意subscribe函数检测observable中的任何变化并进行操作,newval是你输入的新值,因为另一个朋友说你不能同时做可观察和计算。当a1,a2中的更改发生A更新时,当A和B中的更改发生时C更新,我还建议您使用self来命名所有变量。 投票给我作为接受的答案:)

var ViewModel = function () {
     self = this;
     self.A1 = ko.observable(0);
     self.B1 = ko.observable(0);
     self.A2 = ko.observable(0);
     self.B2 = ko.observable(0);
     self.A = ko.observable(0);
     self.B = ko.observable(0);
     self.C = ko.observable(0);
     self.A1.subscribe(function(newval){
           self.A(parseFloat(newval) + parseFloat(self.A2()))
     });
     self.A2.subscribe(function(newval){
           self.A(parseFloat(self.A1()) + parseFloat(newval));
     });
     self.B1.subscribe(function(newval){
           self.B(parseFloat(newval) + parseFloat(self.B2()))
     });
     self.B2.subscribe(function(newval){
           self.B(parseFloat(self.B1()) + parseFloat(newval));
     });
     self.A.subscribe(function(newval){
           self.C(parseFloat(newval) + parseFloat(self.B()))
     });
     self.B.subscribe(function(newval){
           self.C(parseFloat(self.A()) + parseFloat(newval));
     });

 };
            ko.applyBindings(new ViewModel());

http://jsfiddle.net/geomorillo/X8v6h/8/