2014-11-05 53 views
0

我有一个函数,在里面我正在做一些计算,我想把计算结果写到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对象等并且我将循环通过该可观察阵列。

任何建议表示赞赏。

+1

什么问题?你在某处遇到错误吗? – PatrickSteele 2014-11-05 12:38:24

+0

没有错误队友一切都很好,但金额是remians空白becoz写甚至没有射击我相信 – 2014-11-05 13:33:56

回答

2

为计算

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

我想这个工程,但我可能知道为什么断点没有击中在我的代码写功能的原因? – 2014-11-05 13:32:53

+1

据我了解你的视图标记,你不绑定“自动计算”任何输入,不是吗? – TSV 2014-11-05 13:35:47

+0

好吧,我相信只有在我们想用我们用于计算的相同观察值时才使用写入。 – 2014-11-05 13:37:20

1

假设你是自动计算量可以重新计算金额自动

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

或使用量,我没有看到书面计算观察到的任何逻辑。 (在你的情况下,这取决于费率和数量)

我们可以从计算的可观察读取函数写入数量可观察值。如果您想要捕获单个可观察值(可计算可观察值)中数量和速率的变化,那么您的写入方法将不会被调用,因为您没有向计算的可观察值中写入任何内容,但是如果您提供了文本或尝试更新,如

innerself.AutoCalculate(somevalue); 

通过代码然后写入方法将被调用。

http://jsfiddle.net/2v3e7480/116/

我已编辑在所读取的方法计算观察到的写达可观察

innerself.Amount(innerself.Volume()*innerself.Rate()); 

并且还我已删除我先前提到的所有的订阅。

因此,如果任何费率或体积发生变化,金额会发生变化,并且可以通过文本框独立更改金额(顺便说一下,这不会改变计算的可观察值)。

+0

哈是的,如果我可以绑定'AutoCalculate'它可以直接完成,但我需要在我的绑定中使用'Amount'来显示计算的数量。背后的原因是用户可以超额使用并保存。如果我像你所说的那样使用我总是得到计算值。 – 2014-11-05 13:41:50

+1

在那里提供AutoCalculate,然后更改自动计算中的金额。通过这种方式,如果用户更改数量或费率,自动计算填充金额,然后您可以在自动计算的文本框中放置一些值,该值覆盖金额 – 2014-11-05 13:55:48

+1

@supercool此外,您还可以订阅可观察量并将其写回计算的可观察值,如果你真的想要这样的话:)。这是为了让你把时间发生的逻辑。我已根据您的意见更新小提琴 – 2014-11-05 14:02:12