2013-12-12 1 views
0

Я бренд, шлепающий новичок в knockout.js, поэтому простите, если это простой вопрос.переопределить свойство JSON, которое должно быть вычислено

Я получаю данные JSON от веб-службы, которая уже содержит свойство, которое необходимо вычислить. Что-то вроде

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

Сумма SumofValues ​​должна быть суммой ValueA и ValueB. Я хочу использовать плагин сопоставления для создания моей модели viewmodel, но переопределить создание SumOfValues, чтобы он был вычислен. Когда ViewModel преобразуется обратно в данные JSON (для отправки обратно в веб-службу), я хочу, чтобы 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 в документации для нокаута. Они прямо внедряются. Если вам нужна пробная скрипка, дайте мне знать, но это поможет вам выполнить то, что вы хотите.