Ответ 1
Вот поток с несколькими разными методами, чтобы сохранить числовое значение: https://groups.google.com/d/topic/knockoutjs/SPrzcgddoY4/discussion
Один из вариантов заключается в том, чтобы включить эту проблему в вашу модель представления и создать numericObservable
для использования вместо обычного наблюдаемого. Это может выглядеть так:
ko.numericObservable = function(initialValue) {
var _actual = ko.observable(initialValue);
var result = ko.dependentObservable({
read: function() {
return _actual();
},
write: function(newValue) {
var parsedValue = parseFloat(newValue);
_actual(isNaN(parsedValue) ? newValue : parsedValue);
}
});
return result;
};
Пример: http://jsfiddle.net/rniemeyer/RJbdS/
Другой вариант - обработать это с помощью специальной привязки. Вместо использования привязки value
вы можете определить привязку numericValue
и использовать ее вместо этого. Это может выглядеть так:
ko.bindingHandlers.numericValue = {
init : function(element, valueAccessor, allBindings, data, context) {
var interceptor = ko.computed({
read: function() {
return ko.unwrap(valueAccessor());
},
write: function(value) {
if (!isNaN(value)) {
valueAccessor()(parseFloat(value));
}
},
disposeWhenNodeIsRemoved: element
});
ko.applyBindingsToNode(element, { value: interceptor }, context);
}
};