【问题标题】:Angular Directive for input Numbers only仅用于输入数字的 Angular 指令
【发布时间】:2015-12-22 02:09:27
【问题描述】:

我正在创建一个directive 来限制输入框只接受数字。它应该接受 1-9999999999,但没有前导 0。它正在工作,但在输入第一个数字后,它接受所有数字和字符。请帮我解决这个问题。它应该接受 10,而不是 01。为此,我的代码是,

HTML:

<input type="text" ng-model="number" required="required" numbers-only="numbers-only" />

JS:

angular.module('myApp', []).directive('numbersOnly', function(){
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {
       modelCtrl.$parsers.push(function (inputValue) {
           if (inputValue == undefined) return '' 
           var transformedInput = inputValue.replace(/^[^1-9]*/g, ''); 
           if (transformedInput!=inputValue) {
              modelCtrl.$setViewValue(transformedInput);
              modelCtrl.$render();
           }         

           return transformedInput;         
       });
     }
   };
});

function MyCtrl($scope) {
    $scope.number = ''
}

小提琴:FIDDLE

【问题讨论】:

    标签: javascript jquery html angularjs regex


    【解决方案1】:

    只需将替代的^0+ 添加到/[^0-9]+/g 以便可以删除前导零:

    var transformedInput = inputValue.replace(/^0+|[^0-9]+/g, ''); 
    //                                         ^^^              
    

    updated fiddle

    ^0+ 匹配字符串开头 (^) 处的 1 个或多个 (+) 零。

    【讨论】:

      【解决方案2】:

      我发现这个工作fiddle(不是我创建的)。希望这会有所帮助。

      指令:

      fessmodule.directive('format', ['$filter', function ($filter) {
      return {
          require: '?ngModel',
          link: function (scope, elem, attrs, ctrl) {
              if (!ctrl) return;
      
      
              ctrl.$formatters.unshift(function (a) {
                  return $filter(attrs.format)(ctrl.$modelValue)
              });
      
      
              ctrl.$parsers.unshift(function (viewValue) {
                  var plainNumber = viewValue.replace(/[^\d|\-+|\.+]/g, '');
                  elem.val($filter(attrs.format)(plainNumber));
                  return plainNumber;
              });
          }
      };
      }]);
      

      附:我没有测试过。

      【讨论】:

        【解决方案3】:

        你只需要从你的模式中删除第一个^。这里是updated fiddle

        使用这个 -

        replace(/[^1-9]*/g, '');
        

        你可以使用下面的限制0开头updated fiddle-

        replace(/^0|[^0-9]/, '');
        

        【讨论】:

        • 不,它根本不接受 0.. 我想这就是你想要的??
        • 不,我只想要没有前导 0。它应该接受 10,而不是 01。
        猜你喜欢
        • 2020-03-26
        • 2020-12-08
        • 2023-03-06
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多