Вы можете добавить функцию обрезки к наблюдаемым, например, добавив пользовательскую функцию к ko.subscribable.fn
, как объяснено в другой SO post :
ko.subscribable.fn.trimmed = function() {
return ko.computed({
read: function() {
return this();
},
write: function(value) {
this(value.trim());
this.valueHasMutated();
},
owner: this
}).extend({ notify: 'always' });
};
var vm = function () {
this.num = ko.observable().trimmed().extend({ number: true });
this.num(' 2 ');
}
ko.applyBindings(new vm());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.min.js"></script>
<input type="text" data-bind="value: num" />
PS Не поддавайтесь искушению добавить trim()
вызов в плагин валидатора Knockout number
rule:
// this is the original 'number' rule implemetation, with a 'trim()' call added to it
ko.validation.rules['number'] = {
validator: function (value, validate) {
if (!validate) { return true; }
return ko.validation.utils.isEmptyVal(value) ||
(validate && /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value.trim()));
},
message: 'Please enter a number.'
};
. .. потому что вы не хотите, чтобы обрезка происходила во время проверки, но намного раньше, то есть: во время записи.