角度指令忽略非数字输入

IT技术 javascript angularjs angularjs-directive
2021-03-15 02:54:19

我必须为 IE8 编写一些代码。我有一个 ng-repeat 创建一个充满以下内容的表格:

<input production-qty type="text" class="input-mini" maxlength="3" ng-model="day.qtyA" ui-event="{ blur : 'updateProduction(day)' }" ng-disabled="day.type=='H'">

IE8 不会做 type=number

我想要一个指令,该指令将忽略该输入字段上不是数字键的击键......即......0 - 9

我不想让用户键入 abc 并污染模型,然后告诉他们该值无效。我宁愿不让他们输入任何一开始就无效的数据。

4个回答

HTML:

<input production-qty type="text" maxlength="3" ng-model="qty1">

指示:

app.directive('productionQty', function() {
  return {
    require: 'ngModel',
    link: function (scope, element, attr, ngModelCtrl) {
      function fromUser(text) {
        var transformedInput = text.replace(/[^0-9]/g, '');
        console.log(transformedInput);
        if(transformedInput !== text) {
            ngModelCtrl.$setViewValue(transformedInput);
            ngModelCtrl.$render();
        }
        return transformedInput;  // or return Number(transformedInput)
      }
      ngModelCtrl.$parsers.push(fromUser);
    }
  }; 
});

普朗克

另请参阅input 中 ng-model 的过滤器我上面的答案是模仿 pkozlowski.opensource 的答案。

我查看了 ng-pattern,但它没有过滤文本框中显示的内容。它设置$scope.qty1undefined,但不需要的字符在文本框中可见。

如果我想向输入添加 2 个指令 - 每个指令都通过 push() 添加到 modelCtrl.$parsers 怎么办?在这种情况下,似乎只有“梯子”正在执行。
2021-04-21 02:54:19
@MarkRajcok - 在以更高的频率使用 angular 之后,我意识到我可以使它更有用作为将正则表达式作为属性的“过滤输入”指令:-)
2021-05-03 02:54:19
这对我不起作用,我必须在函数 fromUser 的第一行添加以下代码 if (text === undefined) return text;
2021-05-04 02:54:19
感谢您的回答,它适用于我使用 angularjs 1.3.x。如果它对任何人有帮助,我最终添加了以下内容以防止光标跳到无效字符的末尾: if(transformedInput !== inputValue) { var el = element[0]; var cursorPosition = el.selectionStart - 1; // minus one because the character entry advances the cursor position ngModelCtrl.$setViewValue(transformedInput); ngModelCtrl.$render(); el.setSelectionRange(cursorPosition, cursorPosition); }
2021-05-05 02:54:19
“我查看了 ng-pattern,但它没有过滤文本框中显示的内容” - 正是......我会尝试一下,看看它是如何工作的......感谢您的帮助!
2021-05-06 02:54:19

HTML:

<input type="number" name="graduationYear" ng-model="gradYear" only-num>

指示:

directive('onlyNum', function() {
    return function(scope, element, attrs) {

        var keyCode = [8, 9, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110];
        element.bind("keydown", function(event) {
            //console.log($.inArray(event.which,keyCode));
            if ($.inArray(event.which, keyCode) === -1) {
                scope.$apply(function() {
                    scope.$eval(attrs.onlyNum);
                    event.preventDefault();
                });
                event.preventDefault();
            }

        });
    };
});
这很有效,唯一的问题是它阻止了CTRL+ a
2021-05-07 02:54:19

首先将此代码包含在 js 文件中 numericInput.js

指令:-

.directive('numeric', function() {
    return function(scope, element, attrs) {

        $(element[0]).numericInput({ allowFloat: true });

    };
})

HTML :-

 <input type="text" numeric />

演示 Numeric Demo

尝试输入负数
2021-04-22 02:54:19
使用这个 <input type="number" numeric /> ...但你仍然没有写负号你必须使用向下箭头键来表示负数
2021-05-01 02:54:19

不是指令,但我只使用:

控制器:

    $scope.blockNonNumber = function (val, field){

       $scope[field] = val.toString().replace(/[^0-9]/g, '');

    }

html:

<input type="text" ng-model="price" ng-change="blockNonNumber(price, 'price')" pattern="[0-99]">

它不是指令,但可以在指令中使用