在淘汰赛中仅输入数字类型

and*_*a86 19 javascript knockout-2.0 knockout.js

我读了很多教程,但我不知道怎么做,这是输入

input(type="text",name="price",id="price"data-bind="text: price,valueUpdate:['afterkeydown','propertychange','input']")
Run Code Online (Sandbox Code Playgroud)

这是我的viewModel

price: ko.computed(function()
{
    return parseFloat(this.replace(' ','').replace(/[^0-9\.]+/g,"")) || '';
},this)
Run Code Online (Sandbox Code Playgroud)

但这导致错误:这没有方法替换??? 我怎样才能将价格值传递给计算函数?

小智 46

最好创建自定义绑定http://knockoutjs.com/documentation/custom-bindings.html,它只接受允许的字符[0-9,.]作为数字表示.

将此行放入您的视图中

<input id="text" type="text" data-bind="numeric, value: number">
Run Code Online (Sandbox Code Playgroud)

将此行放入您的模型中(记得将数字绑定为可观察的属性)

ko.bindingHandlers.numeric = {
    init: function (element, valueAccessor) {
        $(element).on("keydown", function (event) {
            // Allow: backspace, delete, tab, escape, and enter
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
                // Allow: . ,
                (event.keyCode == 188 || event.keyCode == 190 || event.keyCode == 110) ||
                // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
                // let it happen, don't do anything
                return;
            }
            else {
                // Ensure that it is a number and stop the keypress
                if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                    event.preventDefault();
                }
            }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 这真的有用吗?对我来说,如果它在UI的某个地方,它不会更新Observable吗?例如,您有<input ...>,如上所述,还有一些<span data-bind ="text:number"> </ span>.在这种情况下,如果用户在输入内编辑数字,则在编辑完成后不会更新UI. (2认同)
  • 你如何处理荷兰语键盘?数字在哪里 Shift + Key ? (2认同)

Lem*_*emo 9

Knockout为此提供了扩展.从knockoutjs.com 检查这个,解释如何使用可观察的扩展器强制输入为数字.我粘贴文档中的代码:

源代码:查看

<p><input data-bind="value: myNumberOne" /> (round to whole number)</p>
<p><input data-bind="value: myNumberTwo" /> (round to two decimals)</p>
Run Code Online (Sandbox Code Playgroud)

源代码:查看模型

ko.extenders.numeric = function(target, precision) {
    //create a writable computed observable to intercept writes to our observable
    var result = ko.pureComputed({
        read: target,  //always return the original observables value
        write: function(newValue) {
            var current = target(),
                roundingMultiplier = Math.pow(10, precision),
                newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
                valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;

            //only write if it changed
            if (valueToWrite !== current) {
                target(valueToWrite);
            } else {
                //if the rounded value is the same, but a different value was written, force a notification for the current field
                if (newValue !== current) {
                    target.notifySubscribers(valueToWrite);
                }
            }
        }
    }).extend({ notify: 'always' });

    //initialize with current value to make sure it is rounded appropriately
    result(target());

    //return the new computed observable
    return result;
};

function AppViewModel(one, two) {
    this.myNumberOne = ko.observable(one).extend({ numeric: 0 });
    this.myNumberTwo = ko.observable(two).extend({ numeric: 2 });
}

ko.applyBindings(new AppViewModel(221.2234, 123.4525));
Run Code Online (Sandbox Code Playgroud)


小智 5

我有一个类似的问题。

我还需要确保仅内部值,对于 IE9 及更高版本(因此 type=numberical 是不够的),并且由于我们有很多国际客户,我也不能依赖键码,所以以下是我最终的结果和:

//In my js class method (self is this as usual)
self.ensureNumberical = function (data, e) {
    var keyValue = e.key;
    if (keyValue.match(/[0-9]/g)) {
        return true;
    }
    return false;
}

//In my MVC View
data-bind="event: { keypress: ensureNumberical }"
Run Code Online (Sandbox Code Playgroud)