2014-09-05 14 views
0

我有一個產品列表{名稱,數量,價格,總計} .I初始<input id='Price'>與值0, 當改變一個數量產品,爲Automic計算合計=生化的*價格,與Price = $('#Price').val()KnockoutJS當我改變值輸入時,幫助我,列表項目已經初始化不改變值

如果網格初始化空的,我正常工作,但是,當我與一些產品網格初始化並設置<input id='Price'>值爲0,計算機無法正常工作。

我想自動計算當我改變<input id='Price'> 這是我在jsfiddle的例子,但它不工作。 http://jsfiddle.net/bd0ktx5r/5/

+0

我想它會更好,如果你把價格作爲一個可觀察你的視圖模型,並從它的價值。 – 2014-09-05 06:04:07

+0

我剛剛修復的jsfiddle演示,你可以再次嘗試,我想價格是一個文本輸入,當它改變,所有的總規模將再次計算 – 2014-09-05 06:11:16

+0

你可以在這裏嘗試一下:http://jsfiddle.net/bd0ktx5r/5/ – 2014-09-05 06:15:00

回答

1

這是你想要的嗎? http://jsfiddle.net/bd0ktx5r/9/

我改變了一堆東西,因爲一開始我找不到錯誤,但是當我打開控制檯時,我意識到有很多語法錯誤等等。

我改變的是價格的輸入域的主要事情:我束縛對可觀察到的我加入到視圖模型讓你可以計算到它的變化。爲此,必須將價格觀察值傳遞給Product的構造函數。

我還清理你的代碼有點希望,使其更具可讀性鹿角更容易理解。

的問題是,一個ko.computed只響應在它使用的觀測(依賴)的變化。由於您使用jQuery從輸入字段獲取值,因此ko.computed無法知道價格何時發生變化。避免這些錯誤的最好方法是始終使用knockout,而不是將其與jQuery混合以獲取或設置值。代碼

有趣的位:

var Product = function (product, priceObservable) 
{ 
    var self = this; 
    // omitted code 
    self.Total = ko.computed(function() { 
     // Here I use the observable passed into the function 
     return priceObservable() === 0 ? 0 : (priceObservable() * self.Quatity()).toFixed(2); 
    }); 
}; 

var ProductModel = function (json) { 
    var self = this; 
    self.price = ko.observable(3000); // 3000 can be any initial value 
    self.products = ko.observableArray(json.map(function (item) { 
     return new Product(item, self.price); 
    })); 
}; 

var productViewModel = new ProductModel(json); 
ko.applyBindings(productViewModel); 

<input type="text" data-bind="value: price, valueUpdate: 'afterkeydown'" /> 
+0

在這裏,我嘗試,但當更改價格= 2000和添加新產品,但產品舊仍計算與價格= 3000 http://jsfiddle.net/bd0ktx5r/8/ – 2014-09-05 06:46:03

+0

如何可以當我改變價值輸入文字,所有產品更改總數 – 2014-09-05 06:53:05

+0

你把它改回jQuery,所以現在它不再工作。這正是我所說的:不要用jQuery來讀取值:) 我給出的答案使用可觀察的價格字段,它的工作原理就像你說的那樣。 – 2014-09-05 06:58:49