У меня есть наблюдаемое, что я привязываюсь к элементу HTML input type="text"
. Наблюдаемое содержит числа с плавающей запятой. Я хочу, чтобы значение в текстовом поле отображалось до двух знаков после запятой. Таким образом, 1 будет 1,00, 1,2 - 1,20 и так далее. Я создал пользовательские привязки, которые я думаю, что работы для вывода форматированного значения, но не фиксирует ввод данных пользователем:Как сделать нокаутом пользовательское привязку для текстовых полей, которые формируют числа?
ko.bindingHandlers.numericValue = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
},
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
precision = ko.utils.unwrapObservable(allBindingsAccessor().precision) || ko.bindingHandlers.numericValue.defaultPrecision;
var formattedValue = '';
if (value) {
if (typeof value === "string") {
value = parseFloat(value);
}
formattedValue = value.toFixed(precision);
} else {
value = 0;
formattedValue = value.toFixed(precision);
}
$(element).val(formattedValue);
},
defaultPrecision: 1
};
Binding:
<input type="text" maxlength="6" class="bb width-100p" data-bind="numericValue: marketRate, precision: 2" />
Observable на модели:
self.marketRate = ko.observable(formatNumber(dc.marketRate, 2)).extend({
required: { message: 'Required', onlyIf: function() { return self.isSelected(); }},
min: { params: 0, onlyIf: function() { return self.isSelected(); } },
max: { params: 999999.99, onlyIf: function() { return self.isSelected(); } },
pattern: { message: 'Maximum 2 decimal places', params: /^\d*(\.\d{1,2})?$/, onlyIf: function() { return self.isSelected(); } }
});
function formatNumber(value, places) {
value = ko.utils.unwrapObservable(value);
if (value) {
if (typeof value === "string") {
value = parseFloat(value);
}
return value.toFixed(places);
}
value = 0;
return value.toFixed(places);
}
Нужно ли что-нибудь обновить наблюдаемое значением, введенным пользователем? Этот код никогда не обновляет наблюдаемый. Я предполагаю, что мне нужно вызвать код привязки значения Knockout.
Оба эти решения работают частично для меня. Они не уважают проверку нокаута, которую я имею на наблюдаемом, есть ли способ иметь форматирование и проверку? Второй отрезанный не обновляет базовые наблюдаемые для меня. – DaveB
В последней строке попробуйте обернуть вычисление в функции.ko.applyBindingAccessorsToNode (элемент, {значение: функция() {return formattingComputed;}}, bindingContext); Я обновил свой ответ для соответствия. –
Как выглядит ваша настройка проверки? Это использование плагина проверки нокаута? –