Подтвердить что ты не робот

Как вы можете ограничить значение из ввода с помощью AngularJS?

Я ищу способы ограничить значение внутри входа 4 и обработать 4-значное значение для моего контроллера.

 <input type="number" class="form-control input-lg"
 ng-model="search.main" placeholder="enter first 4 digits: 09XX">
                {{ search.main | limitTo:4}}
4b9b3361

Ответ 1

Всегда можно сделать для него директиву:

app.directive("limitTo", [function() {
    return {
        restrict: "A",
        link: function(scope, elem, attrs) {
            var limit = parseInt(attrs.limitTo);
            angular.element(elem).on("keypress", function(e) {
                if (this.value.length == limit) e.preventDefault();
            });
        }
    }
}]);

<input limit-to="4" type="number" class="form-control input-lg" ng-model="search.main" placeholder="enter first 4 digits: 09XX">

Ответ 2

Вы всегда можете использовать ng-minlength, ng-maxlength для длины строки и min, max для ограничения количества. Попробуйте это

<input type="number" 
       name="input"
       class="form-control input-lg"
       ng-model="search.main" 
       placeholder="enter first 4 digits: 09XX"
       ng-minlength="1" 
       ng-maxlength="4" 
       min="1" 
       max="9999">

DEMO FIDDLE

Ответ 3

Я использовал принятый ответ как точку запуска, но это то, что я придумал.

angular.module('beastTimerApp')
  .directive('awLimitLength', function () {
  return {
    restrict: "A",
    require: 'ngModel',
    link: function (scope, element, attrs, ngModel) {
      attrs.$set("ngTrim", "false");
      var limitLength = parseInt(attrs.awLimitLength, 10);// console.log(attrs);
      scope.$watch(attrs.ngModel, function(newValue) {
        if(ngModel.$viewValue.length>limitLength){
          ngModel.$setViewValue( ngModel.$viewValue.substring(0, limitLength ) );
          ngModel.$render();
        }
      });
    }
  };
});

Использование

<input name="name" type="text"  ng-model="nameVar" aw-limit-length="10"/>

Ключ должен использовать $setViewValue() и $render() для установки и отображения изменений соответственно. Это позволит убедиться, что значения $viewValue и $modelValue верны и отображаются правильно. Вы также хотите установить ngTrim на false, чтобы пользователь не добавлял лишние пробелы. Этот ответ является объединением ответа @tymeJV и этого сообщения в блоге... https://justforchangesake.wordpress.com/2015/01/10/useful-angularjs-directives/

Ответ 4

Будет делать это, позволяя выполнять обратные пробелы и удалять.

app.directive("limitTo", [function() {
    return {
    restrict: "A",
        link: function(scope, elem, attrs) {
            var limit = parseInt(attrs.limitTo);
            angular.element(elem).on("keydown", function() {
                if(event.keyCode > 47 && event.keyCode < 127) {
                    if (this.value.length == limit) 
                        return false;
                }   
            }); 
        }
    }
}]);

Ответ 5

вы можете использовать этот код:

<input type="number" class="form-control input-lg" 
       ng-model="search.main" 
       ng-keypress="limitKeypress($event,search.main,4)"
       placeholder="enter first 4 digits: 09XX">

и код AngularJS:

$scope.limitKeypress = function ($event, value, maxLength) {
        if (value != undefined && value.toString().length >= maxLength) {
            $event.preventDefault();
        }
    }

Ответ 6

Вместо этого можно использовать ng-значение:

ng-value="(minutes > 60 ? minutes = 0 : minutes)"

В html-коде:

<input type="text" class="form-control" ng-model="minutes" ng-maxlength="2" ng-pattern="/^[0-9]*$/" ng-value="(minutes > 60 ? minutes = 0 : minutes)"/>

Это проверит значение и, если оно больше 60, оно заменяет значение 0.

Ответ 7

Не нужно использовать директиву AngularJS.

Просто используйте хороший старый стандартный атрибут html maxlength.

<input type="text" maxlength="30" />

Ответ 8

Как есть проблема в приведенной выше директиве (ответ tymeJV). Если вы введете максимальную длину один раз, то он не примет никакого другого символа даже в обратном пространстве. То есть, если limit-to = "4", и если вы ввели 4 символа в поле ввода, вы не сможете его удалить. Итак, вот обновленный ответ.

app.directive("limitTo", [function () {
        return {
            restrict: "A",
            link: function (scope, elem, attrs) {
                var limit = parseInt(attrs.limitTo);
                elem.bind('keypress', function (e) {
//                    console.log(e.charCode)
                    if (elem[0].value.length >= limit) {
                        console.log(e.charCode)
                        e.preventDefault();
                        return false;
                    }
                });
            }
        }
    }]);

Ответ 9

Мы можем написать директиву для прослушивания события keypress. Но для некоторых старых браузеров это событие не запускается. Вот почему я создал директиву таким образом, чтобы не было зависимости от ограничения конкретных событий браузера. Я создал директиву angular, чтобы ограничить количество текста в поле ввода.

'use strict';
angular.module("appName")
.directive("limitTo", [function() {
return {
restrict: "A",
require: "ngModel",
link: function(scope, elem, attrs, ctrl) {
    var limit = parseInt(attrs.limitTo);
    ctrl.$parsers.push(function (value) {
        if (value.length > limit){
            value = value.substr(0, limit);
            ctrl.$setViewValue(value);
            ctrl.$render();
        }
        return value;
    });
 }
}}]);

Использование: <input limit-to="3" ng-model="test"/> допускает только 3 символа в поле ввода.

Ответ 10

Запустите эту операцию при любом изменении номера:

var log = Math.log(number) / Math.log(10);
if (log >= 4)
   number = Math.floor(number / Math.pow(10, Math.ceil(log - 4)));

Это всегда будет ограничивать "число" до 4 цифр.

Ответ 11

Angular материал имеет директиву mdMaxlength, если вы хотите отрезать вход на этой длине, вы можете использовать эту директиву:

 app.directive("forceMaxlength", [function() {
   return {
     restrict: "A",
     link: function(scope, elem, attrs) {
       var limit = parseInt(attrs.mdMaxlength);
       angular.element(elem).on("keydown", function() {
         if (this.value.length >= limit) {
           this.value = this.value.substr(0,limit-1);
           return false;
         }
       });
     }
   }
 }]);

Использование:

<input type="text" md-maxlength="30" force-maxlength=""/>

Ответ 12

Я повторяю, что сказал @Данило Кобольд.

Мне нужно было убедиться, что пользователи могут вводить только числа (0-9) [Без 'e' или '.' или '-'] и предел только 4 значения.

app.directive("limitTo", [function() {
    return {
        restrict: "A",
        link: function(scope, elem, attrs) {
            var limit = parseInt(attrs.limitTo);
            var exclude = /Backspace|Enter/;
            angular.element(elem).on("keydown", function(e) {
                if (event.keyCode > 47 && event.keyCode < 58) {
                    if (this.value.length == limit) e.preventDefault();
                } else if (!exclude.test(event.key)) {
                    e.preventDefault();
                }
            });
        }
    }
}]);

Если вы хотите использовать только ограничение, используйте

app.directive("limitTo", [function() {
    return {
        restrict: "A",
        link: function(scope, elem, attrs) {
            var limit = parseInt(attrs.limitTo);
            var exclude = /Backspace|Enter/;
            angular.element(elem).on("keydown", function(e) {
                if (!exclude.test(event.key)) {
                    if (this.value.length == limit) e.preventDefault();
                }
            });
        }
    }
}]);

Вы можете добавить дополнительные ключи, если хотите переменную exclude, например:

var exclude = /Backspace|Enter|Tab|Delete|Del|ArrowUp|Up|ArrowDown|Down|ArrowLeft|Left|ArrowRight|Right/;

Получил идею из этого сообщения

Надеюсь, я помог кому-то.

Ответ 13

Вы можете просто использовать

ui-mask="9999"

в качестве атрибута в вашем представлении.

Ответ 14

**

app.directive("limitTo", [function() {
    return {
        restrict: "A",
        link: function(scope, elem, attrs) {
            var limit = parseInt(attrs.limitTo);
            var exclude = /Backspace|Enter/;
            angular.element(elem).on("keydown", function(e) {
                if (e.keyCode > 47 && e.keyCode < 58) {
                    if (this.value.length == limit) e.preventDefault();
                } else if (!exclude.test(e.key)) {
                    e.preventDefault();
                }
            });
        }
    }
}]);

**