这个想法很简单,但是我真的不知道如何解决以下问题。

我想计算一个圆的周长

 U = 2*Math.PI*R


因此,U是外围,R是圆的半径。单向解决方案很容易。 HTML代码看起来像

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


和ViewModel看起来像

 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 });


但是,再次,这只是单向解决方案。

最佳答案

只需使用可写的可计算观察值

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

关于javascript - KnockoutJS:依赖于两个可观察对象双向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22204797/

10-10 08:51