Knockout.js 敲除JS格式的数字光标行为
我们的用户在输入字段中输入值时开始注意到一些奇怪的行为。如果他们输入12000个it格式,则可通过可观察设备上的扩展器将其转换为12000个。如果他们将光标移到逗号后面,并删除前一个0,试图向数字添加500,则光标将移到数字的末尾,结果为12005 重要的是,我们使用valueUpdate:'afterkeydown'在模型键入时保持同步 有没有更好(正确)的方法来处理这个问题Knockout.js 敲除JS格式的数字光标行为,knockout.js,Knockout.js,我们的用户在输入字段中输入值时开始注意到一些奇怪的行为。如果他们输入12000个it格式,则可通过可观察设备上的扩展器将其转换为12000个。如果他们将光标移到逗号后面,并删除前一个0,试图向数字添加500,则光标将移到数字的末尾,结果为12005 重要的是,我们使用valueUpdate:'afterkeydown'在模型键入时保持同步 有没有更好(正确)的方法来处理这个问题 var ViewModel = function() { this.numberOne = ko.observable
var ViewModel = function() {
this.numberOne = ko.observable(0).extend({ formattedNumeric: null });
this.numberTwo = ko.observable(0).extend({ formattedNumeric: null });
this.addThem = ko.computed(function() {
return this.numberOne.raw() + this.numberTwo.raw();
}, this).extend({ formattedNumeric: null });
})
您需要限制添加逗号的计算值,下面是更新的JSFIDLE
在这里,除非用户停止键入至少500毫秒,否则不会进行逗号计算。您应该调整时间以适应同步速度的需要 谢谢你的回复。您的解决方案大部分时间都有效,但如果您正确计时,可能会因为节流而弄乱计算字段。自定义bindingHandler是否适用于此?可能使用一些自定义光标定位?您正在使用格式化程序更新值,这就是光标移动到末尾的原因。它让人耳目一新。如果在输入字段中显示逗号不像用户键入的那样重要,我只会在视图模型或显示端(文本绑定)进行处理。自定义光标定位会太复杂。顺便说一句,即使没有节流,逗号也会弄乱,我第一次在iPad上看到这一点。我以前没有注意到逗号会弄乱。谢谢你指出这一点。我们正试图找到一个不同的解决方案。可能需要单击编辑,在其中显示格式化文本(文本绑定),然后单击显示未格式化的输入框进行编辑。
ko.extenders.formattedNumeric = function (target) {
function addCommas(numberString) {
numberString += '';
var x = numberString.split('.'),
x1 = x[0],
x2 = x.length > 1 ? '.' + x[1] : '',
rgxp = /(\d+)(\d{3})/;
while (rgxp.test(x1)) {
x1 = x1.replace(rgxp, '$1' + ',' + '$2');
}
return x1 + x2;
}
var result = ko.computed({
read: function () {
return addCommas(target());
},
write: function (newValue) {
if ((typeof newValue) === 'string') {
var num = newValue.replace(/[^0-9\.]+/g, '');
newValue = parseFloat(num);
}
if (newValue > 0) {
target(newValue);
}
}
}).extend({throttle: 500});
result.raw = target;
result(target());
return result;
};