Knockout.js 敲除JS格式的数字光标行为

Knockout.js 敲除JS格式的数字光标行为,knockout.js,Knockout.js,我们的用户在输入字段中输入值时开始注意到一些奇怪的行为。如果他们输入12000个it格式,则可通过可观察设备上的扩展器将其转换为12000个。如果他们将光标移到逗号后面,并删除前一个0,试图向数字添加500,则光标将移到数字的末尾,结果为12005 重要的是,我们使用valueUpdate:'afterkeydown'在模型键入时保持同步 有没有更好(正确)的方法来处理这个问题 var ViewModel = function() { this.numberOne = ko.observable

我们的用户在输入字段中输入值时开始注意到一些奇怪的行为。如果他们输入12000个it格式,则可通过可观察设备上的扩展器将其转换为12000个。如果他们将光标移到逗号后面,并删除前一个0,试图向数字添加500,则光标将移到数字的末尾,结果为12005

重要的是,我们使用valueUpdate:'afterkeydown'在模型键入时保持同步

有没有更好(正确)的方法来处理这个问题

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;
};