我正在使用knockout.js设计一个基于Javascript的欧姆定律计算器(电压,电阻,电流)。
我希望用户能够选择计算的内容,例如,电压,电阻或电流,给定其他两个参数,通过单选按钮。
所以我的问题是,在调用ko.observable
之后,您可以将ko.computed
更改为ko.applyBindings()
,反之亦然吗?
我最初的尝试说不,我已经尝试了这个并且在非工作代码上工作了几个小时,试图让它工作。
答案 0 :(得分:1)
你不能这样做,但是你可以让它们全部读/写ko.computed
,在写入时存储“阴影”值,并在读取时返回该值,如果它们不是选定的数量(如果不是,则返回计算值)
答案 1 :(得分:0)
你甚至不需要像ebohlman建议的那样为此计算可写性
一个简单的演示
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>即可。当所选变量发生变化时,这可以防止某些变量神秘地消失/重新出现。