2014-11-05 55 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