2015-06-08 61 views
3

我想要做的是保持两个文本框的数学同步。我正在使用的字段是小计,税收总额,税率和销售总额。我想要发生的是:我怎样才能得到两个计算值相互绑定?

  • 如果taxRate由用户更新,那么taxTotal将更新为正确的金额(subTotal * taxRate)。
  • 如果将TaxTotal由用户更新,那么TAXRATE应该以正确的金额被更新(将TaxTotal /小计* 100)

我没有走得很远这一点,我想这是因为我一直在考虑支持字段的属性(比如在C#中),而且我在试图找出逻辑以在敲除框架(管理脏状态等)中保持所有约束和可观察的情况时遇到困难。

有没有人有解决方案?据我引导我使用pureComputed而不是计算。例如

this.subTotal = ko.observable(0.00); 

this.taxRate = ko.pureComputed({ 
    read: function(){ 

    }, 
    write: function(){ 

    }, 
    owner: this 
}); 

this.taxTotal = ko.pureComputed({ 
    read: function(){ 

    }, 
    write: function(){ 

    }, 
    owner: this 
}); 

this.saleTotal = ko.computed(function(){ 
    return this.subTotal()+ this.taxTotal(); 
}); 

回答

7

这是一个有趣的想法。一个规则定义了taxTotal计算的读取函数,另一个定义了写入函数。另外两个变量只是可观察的。我忽略了100乘数,因为它不是对称的。它需要在两个功能或两者都不是。

var viewModel = (function() { 
    var subTotal = ko.observable(10), 
     taxRate = ko.observable(5); 


    var taxTotal = ko.computed({ 
     read: function() { 
      return subTotal() * taxRate(); 
     }, 
     write: function (newValue) { 
      taxRate(newValue/subTotal()); 
     } 
    }); 

    return { 
     taxRate: taxRate, 
     taxTotal: taxTotal, 
     subTotal: subTotal 
    }; 
}()); 

ko.applyBindings(viewModel); 

http://jsfiddle.net/ypsdh53q/

+2

下面是用“100的包括:http://jsfiddle.net/kevinvanlierde/ypsdh53q/3/。或者,您也可以使用手动订阅:http://jsfiddle.net/kevinvanlierde/ypsdh53q/2/。不知道这是否准确地反映了OP的需求,但这是你通常采取的百分比税率。 – Tyblitz