无法写入可观察的?使用写入内部计算

时间:2014-11-05 12:35:38

标签: knockout.js

我有一个函数,在其中我正在进行一些计算,我想将计算结果写入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。

任何建议都表示赞赏。

2 个答案:

答案 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());

我也删除了之前提到的所有订阅。

因此,如果更改了任何费率或数量,则更改金额,并通过文本框您可以单独更改金额(顺便说一下,这不会改变计算的可观察量)。