2015-12-21 21 views
2

我正在創建一個directive以限制輸入框只接受數字。它應該接受1-9999999999,但不是前導0.它正在工作,但輸入第一個數字後,它將接受所有數字和字符。請幫我解決this.it應該接受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:FIDDLE

回答

3

只需添加一個替代^0+/[^0-9]+/g,使前導零可能被刪除:

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

updated fiddle

^0+匹配位於字符串開頭(^)處的一個或多個(+)零。

+1

謝謝。這是工作。 – Ved

0

我發現這個工作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; 
     }); 
    } 
}; 
}]); 

附:我沒有測試過。

+0

不,這是不正確的。 – Ved

0

那麼你只需要從你的模式中刪除第一個^。這裏是updated fiddle

使用本 -

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

你可以使用下面的一個限制0時開始updated fiddle -

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

但是它不會在任何地方接受0。你不能輸入10,100等。 – Ved

+0

不,它根本不接受0 ..我想這就是你想要的? –

+0

不,我只是想沒有領先0.它應該接受10,但不是01. – Ved