将ko.observable更改为ko.computed,反之亦然

时间:2013-11-22 22:49:09

标签: javascript binding knockout.js calculator

我正在使用knockout.js设计一个基于Javascript的欧姆定律计算器(电压,电阻,电流)。

我希望用户能够选择计算的内容,例如,电压,电阻或电流,给定其他两个参数,通过单选按钮。

所以我的问题是,在调用ko.observable之后,您可以将ko.computed更改为ko.applyBindings(),反之亦然吗?

我最初的尝试说不,我已经尝试了这个并且在非工作代码上工作了几个小时,试图让它工作。

3 个答案:

答案 0 :(得分:1)

你不能这样做,但是你可以让它们全部读/写ko.computed,在写入时存储“阴影”值,并在读取时返回该值,如果它们不是选定的数量(如果不是,则返回计算值)

答案 1 :(得分:0)

你甚至不需要像ebohlman建议的那样为此计算可写性

一个简单的演示

http://jsfiddle.net/K8t7b/

ViewModel = function() {
    this.selected = ko.observable("1");
    this.valueOne = ko.observable(1);
    this.valueTwo = ko.observable(5);

    this.result = ko.computed(this.getResult, this);    
}

ViewModel.prototype = {
    getResult: function() {
        if(this.selected() === "1") {
            return this.valueOne() - this.valueTwo();
        }

        return this.valueOne() + this.valueTwo();
    }
};

ko.applyBindings(new ViewModel());

编辑:嗯,如果你想让结果显示在正确的值文本框中,你需要使它们可写成像ebohlman suggets一样计算

答案 2 :(得分:0)

正如ebohlman所提到的,我所缺少的重要事情是阴影变量,以及ko.computed使用单独的读/写程序(最近添加的敲除功能)。 / p>

三个变量之一的代码是:

this.voltageS = ko.observable();

this.voltage = ko.computed({
    read: function () {
        if(this.calcWhat() == 'voltage')
        {
            console.log('Calculating voltage');
            if(this.currentS == null)
                return;
            if(this.resistanceS == null)
                return;
            this.voltageS(this.currentS()*this.resistanceS());
            return(this.currentS()*this.resistanceS());
        }
        else
        {
            console.log('Reading from voltage');
            return this.voltageS();
        }
    },
    write: function (value) {
        console.log('Writing to voltage');
        this.voltageS(value)
    },
    owner: this
});

我创建了一个JSFiddle here,它演示了能够在计算哪个变量之间切换。

这段代码的另一个关键部分是,在读取时,如果它恰好是选定的变量,以及从其他两个计算它,我还必须将此结果写回影子变量< / strong>即可。当所选变量发生变化时,这可以防止某些变量神秘地消失/重新出现。