angularjs forzar mayúsculas en el cuadro de texto

I've tried using the uppercase filter but it does not work. I've tried doing it two ways:

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

y

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

The 2nd triggers a javascript error:

Syntax Error: Token 'test' is unexpected, expecting [:]

I want the text to be forced to uppercase as the user types in the textbox.

¿Cómo puedo hacer eso?

preguntado el 05 de mayo de 13 a las 21:05

14 Respuestas

Please see the other answer below, which is superior to this one.

this answer is based on the answer here: ¿Cómo capitalizar automáticamente el primer carácter en un campo de entrada en AngularJS?.

I'd imagine that what you'd want would be a parser function like this:

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>

respondido 29 mar '18, 06:03

perfect, that's what I needed. I didn't see this example. I think the uppercase filter was a bit mis-leading for me.... Thanks - Diana

This is a handy directive! It may be helpful if you tested for the existence of inputValue before calling a method on it however. - matt jensen

Changed the push(capitalize) to unshift(capitalize), but other than that it worked fine. Thx. - christophe geers

+1 I was stuck for over an hour trying to figure out why $parsers y $formatters were not updating the input control. Adding the calls to $setViewValue y $render did the trick. I'm going to ask the Angular team to add this to the docs. - reactivo

you could store the selectionStart of the input before and reset after rendered, so the cursor would not move to the end of the string after each key press. var selection = element[0].selectionStart; modelCtrl.$setViewValue(capitalized); modelCtrl.$render(); element[0].selectionStart = selection; element[0].selectionEnd = selection; - Rucsi

The accepted answer causes problems if someone tries to enter a lowercase letter at the beginning of an existing string.. The cursor moves to the end of the string after each key press. Here's a simple solution that addresses all the issues:

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");
        }
    };
})

Aquí hay un violín: http://jsfiddle.net/36qp9ekL/1710/

Respondido el 31 de enero de 18 a las 00:01

Its to be noted however that the CSS text-transform merely makes the text on-screen uppercase, but the value bound to the model is not. While the accepted answer may have other unintended consequences (like the cursor bumping to the end), this one may too, depending on the requirements. - mattygabe

The value bound to the model is upper cased by the $parser. Or are you referring to the value attribute of the input element? In that case you are correct. - Karen Zilles

Ah - wasn't referring to that necessarily and missed the parser piece somehow. I kind of skimmed your example and my mind instantly focused on the text-transform being applied to the element. I'll smack my own hand for skimming instead of reading :) - mattygabe

Correct me if I'm wrong but I think $(element) y element son equivalentes. - robert4

Ver esta respuesta to keep placeholder as is - Jaydo

The idea is to show (not transform) the string as uppercase at client side and transform into uppercase at server side (users can always control what happens at client side). So:

1) in the html:

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

here no uppercase transformation.

2) in the css:

#test {text-transform: uppercase;}

data is shown as uppercase, but actually still lowercase, if user typed in lowercase. 3) turn the string into uppercase at server side when inserting into database.

= = = = = for playing around, can try follow:

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

but I think ng-change or ng-blur ways are not necessary for your case.

Respondido el 16 de Septiembre de 14 a las 10:09

Now this works and its simple! So that's the best thing! :) Thanks P.S i used ng-keydown as well to make sure user sees the magic sooner :) - NegroQuema027

You cannot make filter on ng-model since it has to be assignable. the workaround is either parser, or simply ng-change.

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

Esto debería funcionar.

Respondido 20 Feb 17, 02:02

Funciona perfectamente - Taxis Milo

Best solution for me so far! - codificadorpc

I would select this as a solution. Simple and value passed to backend also uppercase. - Sh4m

When used with Bootstrap, just add text-uppercase to input's class attribute.

Respondido el 02 de enero de 15 a las 10:01

You can add this then : ::-webkit-input-placeholder { text-transform: none; } ::-moz-placeholder { text-transform: none; } :-ms-input-placeholder { text-transform: none; } input:-moz-placeholder { text-transform: none; }. Añadir .text-uppercase to this classes if needed. - Ludovico Guillaume

It worked on the user interface, but the model value is still lowecase - Diego

If you want to change the model to uppercase, you will need to use model controller's $parsers like explained above. This solution is visual only. - Ludovico Guillaume

You can use bootstrap class for visual purpose, and in your controller, using the toUperCase() function before using your model - Emmanuel P.

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();
}

aquí está mi violín http://jsfiddle.net/mzmmohideen/36qp9ekL/299/

contestado el 19 de mayo de 15 a las 08:05

This solution is wonderful - just the few lines that it needs. It does seem to cancel out my ng-pattern I am using to validate a MAC address using a regex. Any ideas on how I can get both to work? jsfiddle.net/630dkL15 - EspacioNinja

I cant get your question... U got uppercase for your input and you going to compare it with mac_regex is it right? and in your jsfiddle found one external link, it describes about uppercase the given text while binding not for ng-model or run time inputs. that will work for angular output which will bind within it {{}} - Mohideen bin Mohamed

jsfiddle.net/mzmmohideen/oqzs0w8m here is my JSFIDDLE , here when you enter mac address correctly means it shows correct else it return false and dont worry about lower case, when u entered mac correctly at the end it will become upper case - Mohideen bin Mohamed

@SpaceNinja did u got what you want? - Mohideen bin Mohamed

I like your solution, I may use it if I cannot find a solution that capitalizes AS the user types instead of at the end when it finally does validation. I was hoping to see what the issue was with the conflict of ng-pattern and ng-change - jsfiddle.net/rod9pLom/3 - EspacioNinja

This will not work at all.

ng-model is for specifying which field / property from the scope should be bound to the model. Also, ng-model does not accept an expression as value. Expressions in angular.js are things between {{ y }}.

Las uppercase filter could used in the output and everywhere where expressions are allowed.

You cannot do what you want to do, but you could use CSS's text-transform to at least display everything in uppercase.

If you want to have the value of a text field in uppercase letters you can achieve this with some custom JavaScript.

En tu controlador:

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

contestado el 15 de mayo de 13 a las 07:05

good answer, I'll take GHC's though as it is closer to what I want (using an attribute in the view) - Diana

Don't forget to include 'ngSanitizar' in your module!

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
        }
    };

});

  • Pay attention to "?" in "require: '?ngModel',"... only then worked my application.

  • "if(inputValue) {...}" For no undefined error occurs

Respondido 30 Jul 14, 22:07

When using bootstrap:

Primer enfoque: Using class text-uppercase

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

Segundo enfoque: Using style which can be applied with existing class

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

Here is my stackBlitz: https://angular-nvd7v6forceuppercase.stackblitz.io

Respondido 18 Jul 19, 10:07

it is just an alternative , you can use this " text- transform : capitalize ; " in your css and the text entry will be capitalized. unless the user types it in capital letters everywhere.

it is just an alternative ^^

Respondido el 25 de enero de 15 a las 00:01

To improve the answer by Karl Zilles this is my revision of his solution. In my version the placeholder isn't changed to uppercase and works also if you want to do a regex on the string. It also take the "type" of the input string (null or undefined or empty):

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)));
        }
    }
}
});

contestado el 23 de mayo de 17 a las 13:05

Solution with cursor shift fix

.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
            }
        };
    });

Respondido el 19 de junio de 18 a las 13:06

If you want to change model and value, use:

angular.module('MyApp').directive('uppercased', function() {
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
            element.bind("blur change input", function () {
                ngModel.$setViewValue($(this).val().toUpperCase());
                $(this).val($(this).val().toUpperCase());
            });
            element.css("text-transform","uppercase");
        }
    };
});

Luego agrega mayúscula to your html input text

<input  type="text" uppercased />

Respondido el 02 de junio de 20 a las 02:06

I would just use the filter itself in the controller:

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

just keep in mind that, if you you are going to use it inside a controller, for example, you need to inject this filter:

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

respondido 04 nov., 15:22

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.