Угловая сила в верхнем регистре в текстовом поле

Я пробовал использовать фильтр верхнего регистра, но он не работает. Я пробовал сделать это двумя способами:

<input type="text" ng-model="test" uppercase/>

и

<input type="text" ng-model="{{test | uppercase}}"/>

Второй вызывает ошибку javascript:

Синтаксическая ошибка: токен "тест" неожиданен, ожидая [:]

Я хочу, чтобы текст был зашифрован в верхнем регистре, когда пользователь вводит текст в текстовое поле.

Как я могу это сделать?

Ответ 1

Пожалуйста, смотрите другой ответ ниже, который превосходит этот.

этот ответ основан на ответе здесь: Как автокапитализировать первый символ в поле ввода в AngularJS? ,

Я полагаю, что то, что вы хотели бы, было бы функцией парсера, как это:

angular
  .module('myApp', [])
  .directive('capitalize', function() {
    return {
      require: 'ngModel',
      link: function(scope, element, attrs, modelCtrl) {
        var capitalize = function(inputValue) {
          if (inputValue == undefined) inputValue = '';
          var capitalized = inputValue.toUpperCase();
          if (capitalized !== inputValue) {
            // see where the cursor is before the update so that we can set it back
            var selection = element[0].selectionStart;
            modelCtrl.$setViewValue(capitalized);
            modelCtrl.$render();
            // set back the cursor after rendering
            element[0].selectionStart = selection;
            element[0].selectionEnd = selection;
          }
          return capitalized;
        }
        modelCtrl.$parsers.push(capitalize);
        capitalize(scope[attrs.ngModel]); // capitalize initial value
      }
    };
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp">
  <input type="text" ng-model="name" capitalize>
</div>

Ответ 2

Принятый ответ вызывает проблемы, если кто-то пытается ввести строчную букву в начале существующей строки. Курсор перемещается в конец строки после каждого нажатия клавиши. Вот простое решение, которое решает все проблемы:

directive('uppercased', function() {
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, modelCtrl) {
            modelCtrl.$parsers.push(function(input) {
                return input ? input.toUpperCase() : "";
            });
            element.css("text-transform","uppercase");
        }
    };
})

Здесь скрипка: http://jsfiddle.net/36qp9ekL/1710/

Ответ 3

Идея состоит в том, чтобы показать (не преобразовывать) строку как прописную букву на стороне клиента и преобразовать ее в верхний регистр на стороне сервера (пользователи всегда могут контролировать, что происходит на стороне клиента). Итак:

1) в html:

<input id="test" type="text" ng-model="test">

здесь нет преобразования в верхнем регистре.

2) в css:

#test {text-transform: uppercase;}

данные отображаются как заглавные, но на самом деле все еще строчные, если пользователь вводит строчные буквы. 3) превратите строку в верхний регистр со стороны сервера при вставке в базу данных.

= = = = = для игры, можете попробовать:

<input type="text" ng-model="test" ng-change="test=test.toUpperCase();">
<input type="text" ng-model="test" ng-blur="test=test.toUpperCase();">

но я думаю, что ng-change или ng-blur не нужны для вашего случая.

Ответ 4

Вы не можете сделать фильтр на ng-модели, поскольку он должен быть назначен. обходной путь - это либо парсер, либо просто ng-изменение.

<input ng-model="some" ng-change="some = (some | uppercase)"  />

Это должно работать.

Ответ 5

При использовании с Bootstrap просто добавьте text-uppercase для ввода атрибута класса.

Ответ 6

one of the simple way is,
<input type="text" ng-model="test" ng-change="upper(test)/>

just do below 2 line code in your js file,
$scope.upper = function(test){
$scope.test = test.toUpperCase();
}

вот моя скрипка http://jsfiddle.net/mzmmohideen/36qp9ekL/299/

Ответ 7

Это не сработает.

ng-model предназначен для указания того, какое поле/свойство из области действия должно быть привязано к модели. Кроме того, ng-model не принимает выражение как значение. Выражения в angular.js - это вещи между {{ и }}.

Фильтр uppercase может использоваться на выходе и везде, где разрешены выражения.

Вы не можете делать то, что хотите, но можете использовать CSS text-transform, чтобы хотя бы отобразить все в верхнем регистре.

Если вы хотите иметь значение текстового поля заглавными буквами, вы можете достичь этого с помощью специального пользовательского JavaScript.

В вашем контроллере:

$scope.$watch('test', function(newValue, oldValue) {
  $scope.$apply(function() {
    $scope.test = newValue.toUpperCase();
  }
});

Ответ 8

Не забудьте включить в свой модуль ' ngSanitize!

app.directive('capitalize', function() {
    return {
        restrict: 'A', // only activate on element attribute
        require: '?ngModel',
        link : function(scope, element, attrs, modelCtrl) {
            var capitalize = function(inputValue) {
                if(inputValue) {
                    var capitalized = inputValue.toUpperCase();
                    if (capitalized !== inputValue) {
                        modelCtrl.$setViewValue(capitalized);
                        modelCtrl.$render();
                    }
                    return capitalized;
                }
            };
            modelCtrl.$parsers.push(capitalize);
            capitalize(scope[attrs.ngModel]); // capitalize initial value
        }
    };

});

  • Обратите внимание на "?" in "require: ? ngModel ',"... только тогда работал мое приложение.

  • "if (inputValue) {...}" Ошибка undefined

Ответ 9

При использовании начальной загрузки:

Первый подход: использование класса text-uppercase

<input  type="text" class="text-uppercase" >

Второй подход: использование стиля, который может применяться с существующим классом

<input  type="text" class="form-control" style="text-transform: uppercase;">

Вот мой стек Блиц: https://angular-nvd7v6forceuppercase.stackblitz.io

Ответ 10

это просто альтернатива, вы можете использовать это "text-transform: capitalize;" в вашем css, и запись в тексте будет заглавной. если пользователь не набирает его заглавными буквами везде.

это просто альтернатива ^^

Ответ 11

Чтобы улучшить ответ Karl Zilles, это мой пересмотр его решения. В моей версии местозаполнитель не изменяется на верхний регистр и работает также, если вы хотите сделать регулярное выражение в строке. Он также принимает "тип" входной строки (null или undefined или пустой):

var REGEX = /^[a-z]+$/i;
myApp.directive('cf', function() {
    return {
        require: 'ngModel',
        link: function(scope, elm, attrs, ctrl) {
            ctrl.$validators.cf = function(modelValue, viewValue) {
            ctrl.$parsers.push(function(input) {
                elm.css("text-transform", (input) ? "uppercase" : "");
                return input ? input.toUpperCase() : input;
            });
            return (!(ctrl.$isEmpty(modelValue)) && (REGEX.test(viewValue)));
        }
    }
}
});

Ответ 12

Решение с исправлением смещения курсора

.directive('titleCase', function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, element, attrs, modelCtrl) {
                var titleCase = function (input) {
                    let first = element[0].selectionStart;
                    let last = element[0].selectionEnd;
                    input = input || '';
                    let retInput = input.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); });
                    if (input !== retInput) {
                        modelCtrl.$setViewValue(retInput);
                        attrs.ngModel = retInput;
                        modelCtrl.$render();
                        if (!scope.$$phase) {
                            scope.$apply(); // launch digest;
                        }
                    }
                    element[0].selectionStart = first;
                    element[0].selectionEnd = last;
                    return retInput;
                };
                modelCtrl.$parsers.push(titleCase);
                titleCase(scope[attrs.ngModel]);  // Title case  initial value
            }
        };
    });

Ответ 13

Я бы просто использовал фильтр в контроллере:

 $filter('uppercase')(this.yourProperty)

просто имейте в виду, что, если вы собираетесь использовать его внутри контроллера, например, вам нужно ввести этот фильтр:

app.controller('FooController', ['$filter', function($filter) ...