我已经创建了(请原谅混乱 - 目前只是将它一起破解!)淘汰赛中的以下绑定处理程序
所需的功能是,如果字段是数字,那么在显示时它将被格式化为“X”小数位(默认为 2),但基础值是输入的任何内容。
一切正常,但我想添加一个功能,当输入聚焦时,它会显示实际值,我只是不知道如何做到这一点。
IE
- 用户在输入中输入 1.1121
- 当他们离开输入时,它的格式为 1.11
- 如果他们回到输入(焦点)然后它显示 1.1121 进行编辑
这是第 3 点,我不知道如何实现,因为目前它显示 1.11,然后覆盖模糊?
谁能指出我正确的方向 - 基本上我在哪里可以访问焦点上的基础值并将显示的文本替换为基础值?
为简洁起见,我删除了一些其他包装输入的“装饰”代码,因为它们不相关。
提前致谢。
ko.bindingHandlers.specialInput = {
init: function (element, valueAccessor, allBindingsAccessor) {
var value = valueAccessor();
var decimals = allBindingsAccessor().decimals || 2;
var formatString = "";
var interceptor = ko.computed({
read: function () {
if(isNumeric(ko.unwrap(value))){
//to do if time - replace this with a function that will accept any number of decimals
if(decimals == 0){
formatString = "0,0";
}
if(decimals == 1){
formatString = "0,0.0";
}
if(decimals == 2){
formatString = "0,0.00";
}
if(decimals == 3){
formatString = "0,0.000";
}
if(decimals == 4){
formatString = "0,0.0000";
}
if(decimals == 5){
formatString = "0,0.00000";
}
return numeral(ko.unwrap(value)).format(formatString);
}else{
return ko.unwrap(value);
}
},
write: function (newValue) {
if ($.trim(newValue) == '')
value("");
else
if(isNumeric(newValue)){
value(numeral().unformat(newValue));
value.valueHasMutated();
}else{
value(newValue);
value.valueHasMutated();
}
}
}).extend({notify: 'always'});
if (element.tagName.toLowerCase() == 'input') {
ko.applyBindingsToNode(element, {
value: interceptor
});
} else {
ko.applyBindingsToNode(element, {
text: interceptor
});
}
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var value = ko.unwrap(valueAccessor());
return ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
};
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}