2014-03-05 62 views
1

這個想法很簡單,但我並不真正知道如何解決以下問題。KnockoutJS:兩個可觀察對象的雙向依賴關係

欲計算圓的周邊,

U = 2*Math.PI*R 

所以,U是周邊UND R是圓的半徑。單向解決方案很簡單。在HTML代碼看起來像

R: <input data-bind="value: radius"><br> 
U: <input data-bind="value: periphery"> 

和視圖模型看起來像

function ViewModel() { 
    this.radius = ko.observable(1); 
    this.periphery = ko.computed(function(){ 
     var r = parseFloat(this.radius()); 
     return 2*Math.PI*r; 
    },this); 
} 

下面是一個例子:http://jsfiddle.net/dundanox/2SsF9/

在這種單向的解決方案,我在一個半徑鍵入並獲得圓周圍。其實我只是可以扭轉整個解決方案。設置外圍並獲得半徑。但我打算有一個雙向解決方案。我如何使用KnockoutJS來做到這一點?

下一步是在圓形(半徑或外圍)發生變化時觸發事件。通常我會做訂閱:

vm.radius.subscribe(function(r){ // do someting }); 

但是,它只是一個單向的解決方案。

回答

1

只要您可以使用可寫的計算觀測

this.periphery = ko.computed({ 
    read: function() { 
     var r = parseFloat(this.radius()); 
     return 2 * Math.PI * r; 
    }, 
    write: function (value) { 
     var p = parseFloat(value); 
     var r = p/(2 * Math.PI) 
     this.radius(r); 
    }, 
    owner: this 
}); 

JSFIDDLE

+0

好的,謝謝,但這種方法我試過了。那麼半徑就像是初級或「中心」,外圍是次級可觀察的。我想到一個更分散的解決方案。但在大多數情況下,我認爲集中版本非常好。這裏是一個擴展的例子[JSFIDDLE](http://jsfiddle.net/dundanox/6xP5m/7/) – user3356865

相關問題