Numbers get converted to strings
https://groups.google.com/d/topic/knockoutjs/SPrzcgddoY4/discussion
by Nikolai Zujev
HTML
<script src="http://knockoutjs.com/js/jquery.tmpl.js"></script>
<script src="https://github.com/SteveSanderson/knockout/raw/master/build/output/knockout-latest.debug.js"></script>
<label>extend FLOAT: </label>
<input data-bind="value: units1" size="3" />
<span data-bind="text: ko.toJSON(units1)"></span>
<hr/>
<label>extend INTEGER: </label>
<input data-bind="value: units2" size="3" />
<span data-bind="text: ko.toJSON(units2)"></span>
<hr/>
JavaScript
(function(ko){
function NumericExtender(target, defaultValue, isFloat) {
var parse = function(value, defaultValue) {
var parsed = isFloat ? parseFloat(value, 10) : parseInt(value, 10);
return isNaN(parsed) ? (defaultValue || 0) : parsed;
},
result = ko.dependentObservable({
read: function() {
return target();
},
write: function(value) {
var parsed = parse(value, defaultValue);
(target() === parsed) ? target.notifySubscribers() : target(parsed);
},
deferEvaluation: true
});
isFloat = (!!isFloat || void(0) === isFloat);
defaultValue = parse(defaultValue);
var parsed = parse(target(), defaultValue);
if (target() !== parsed) {
target(parsed);
}
return result;
};
ko.extenders.integer = function(target, defaultValue) {
return NumericExtender(target, defaultValue, false);
};
ko.extenders.float = function(target, defaultValue) {
return NumericExtender(target, defaultValue, true);
};
})(ko);
var viewModel = {
units1: ko.observable(2.50).extend({float: 5.75}),
units2: ko.observable(2.50).extend({integer: 7}),
};
viewModel.units1.subscribe(function(v){
console.log(['upd-1', v]);
});
viewModel.units2.subscribe(function(v){
console.log(['upd-2', v]);
});
ko.applyBindings(viewModel);