2015-06-08 62 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