我有一个函数,在其中我正在进行一些计算,我想将计算结果写入observable。
查看型号:
function data()
{
var innerself=this;
innerself.Amount=ko.observable("");
innerself.Volume = ko.observable("");
innerself.Rate=ko.observable("");
innerself.AutoCalculate = ko.computed({
read: function () {
var qty = innerself.Volume();
var val = qty * innerself.Rate();
// innerself.Amount(val.toFixed(2)); its wrong to use like this i feel
return val;
},
write: function (value) {
innerself.Amount(value); // kept break point but its not getting hit at all but read function excecutes
}
},innerself);
}
查看:
//running loop on top via foreach:observablearray
<input type="text" data-bind="value:$data.Volume " />
<input type="text" data-bind="value:$data.Rate"/>
<input type="text" data-bind="value:$data.Amount"/>
我正在使用函数嵌入所有东西,所以稍后我创建一个对象并将对象推送到observablearray等等,我将在视图中循环遍历observablearray。
任何建议都表示赞赏。
答案 0 :(得分:2)
您可以自动重新计算金额
function data() {
var innerself = this;
innerself.Amount = ko.observable(0);
innerself.Volume = ko.observable(0);
innerself.Rate = ko.observable(0);
ko.computed(function() {
innerself.Amount(innerself.Volume() * innerself.Rate());
}, innerself);
}
或使用金额计算
function data() {
var innerself = this;
innerself.Volume = ko.observable(0);
innerself.Rate = ko.observable(0);
innerself.Amount = ko.computed({
read: function () {
return innerself.Volume() * innerself.Rate();
},
write: function (value) {
innerself.Volume(value / innerself.Rate()); // i do not know your algo
}
}, innerself);
}
答案 1 :(得分:1)
假设你是自动计算金额,我没有看到任何写入计算observable的逻辑。 (在您的情况下取决于费率和数量)
我们可以从计算的可观察读取函数写入Amount observable。如果您想在单个可观察量(即计算的可观察值)中捕获数量和速率的变化
您的写入方法不会被调用,因为您没有在计算的observable中写入任何内容,但是如果您提供文本框或尝试更新
innerself.AutoCalculate(somevalue);
通过代码然后调用write方法。
http://jsfiddle.net/2v3e7480/116/
我已经在计算的observable中编辑了read方法,以便写入amount observable
innerself.Amount(innerself.Volume()*innerself.Rate());
我也删除了之前提到的所有订阅。
因此,如果更改了任何费率或数量,则更改金额,并通过文本框您可以单独更改金额(顺便说一下,这不会改变计算的可观察量)。