2013-12-12 61 views
0

我是品牌嶄新的knockout.js,因此如果這是一個非常簡單的問題,請原諒。覆蓋要計算的JSON屬性

我從Web服務獲取JSON數據,該服務已經包含需要計算的屬性。類似於

{ 
    ValueA: 1, 
    ValueB: 3, 
    SumOfValues: 0 
} 

SumofValues需要是ValueA和ValueB的總和。我想使用映射插件來創建我的viewmodel,但是重寫SumOfValues的創建,以便它被計算。當Viewmodel被轉換回JSON數據(用於回發到Web服務)時,我希望SumOfValues包含正確的總和。

我在這個jsfiddle中工作得很好,唯一的問題是當我更改其中一個文本框中的值時,SumofValues屬性不會更新。我認爲這個值會自動依賴於ValueA和ValueB,因爲我在函數中引用它們。

謝謝

回答

3

你需要改變SumOfValues的映射來創建一個計算值而不是可觀察值。下面是一個更新的小提琴,這是否:

http://jsfiddle.net/38MwU/11/

,代碼:

var json = { 
"ValueA": 9, 
"ValueB": 1, 
"SumOfValues": 0 
}; 

function myViewModel(data) { 
var self = this; 

var mapping = { 
    'SumOfValues': { 
     create: function (options) { 
      return ko.computed(function() { 
       return (parseInt(self.ValueA()) + parseInt(self.ValueB())); 
      }); 
     }    
    } 
}; 

ko.mapping.fromJS(data, mapping, self); 

self.isValid = ko.computed(function() { 
    return (self.SumOfValues() == self.ValueA() + self.ValueB() ? "equal" : "not equal"); 
}); 
} 

ko.applyBindings(new myViewModel(json)); 
0

計算的觀察值是隻讀的開箱即用。如果您希望更新計算的觀察值,則需要對其進行修改以支持讀/寫。 Look at the writeable section在敲除文檔的細節。他們直接執行。如果你需要一個樣品小提琴讓我知道,但這應該可以幫助你實現你想要的