如何autocapitalize在AngularJS输入字段的第一个字符?(How to autoc

2019-07-21 01:36发布

如何autocapitalize输入字段中的AngularJS表单元素中的第一个字符?

我看到了jQuery的解决方案了,但相信这必须通过使用指令在AngularJS不同的做法。

Answer 1:

是的,你需要定义一个指令和定义自己的解析器功能:

myApp.directive('capitalizeFirst', function($parse) {
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {
        var capitalize = function(inputValue) {
           if (inputValue === undefined) { inputValue = ''; }
           var capitalized = inputValue.charAt(0).toUpperCase() +
                             inputValue.substring(1);
           if(capitalized !== inputValue) {
              modelCtrl.$setViewValue(capitalized);
              modelCtrl.$render();
            }         
            return capitalized;
         }
         modelCtrl.$parsers.push(capitalize);
         capitalize($parse(attrs.ngModel)(scope)); // capitalize initial value
     }
   };
});

HTML:

<input type="text" ng-model="obj.name" capitalize-first>

小提琴



Answer 2:

请记住,并非一切都需要一个角度的解决方案。 你看这个有很多与jQuery的人群; 他们喜欢用昂贵的jQuery的功能做的事情,更简单或更容易做纯JavaScript。

所以,当你很可能会需要一个大写功能和上面的答案提供了,这将是一个很大更有效率只使用CSS规则“文本转换:大写”

<tr ng-repeat="(key, value) in item">
    <td style="text-transform: capitalize">{{key}}</td>
    <td>{{item}}</td>
</tr>


Answer 3:

您可以创建自定义过滤器“利用”,它适用于任何你想要的字符串:

 <div ng-controller="MyCtrl">
     {{aString | capitalize}} !
</div>

对于过滤器的JavaScript代码:

var app = angular.module('myApp',[]);

myApp.filter('capitalize', function() {
    return function(input, scope) {
        return input.substring(0,1).toUpperCase()+input.substring(1);
    }
});


Answer 4:

使用CSS:第一字母伪类。

你需要把一切都在小写字母和后应用大写只对第一个字母

p{
    text-transform: lowercase;
}
p:first-letter{
    text-transform: uppercase;
}

这里有一个例子: http://jsfiddle.net/AlexCode/xu24h/



Answer 5:

修正了他的代码,利用每一个字的第一个字符。 如果你给“ 李四 ”,输出是“ 李四

myApp.directive('capitalizeFirst', function() {
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {
        var capitalize = function(inputValue) {
           var capitalized = inputValue.split(' ').reduce(function(prevValue, word){
            return  prevValue + word.substring(0, 1).toUpperCase() + word.substring(1) + ' ';
        }, '');
           if(capitalized !== inputValue) {
              modelCtrl.$setViewValue(capitalized);
              modelCtrl.$render();
            }         
            return capitalized;
         }
         modelCtrl.$parsers.push(capitalize);
         capitalize(scope[attrs.ngModel]);  // capitalize initial value
     }
   };
});


Answer 6:

我希望能有一个过滤器和指令。 这应该与光标移动的工作:

app.filter('capitalizeFirst', function () {
    return function (input, scope) {
        var text = input.substring(0, 1).toUpperCase() + input.substring(1).toLowerCase();
        return text;
    }
});

app.directive('capitalizeFirst', ['$filter', function ($filter) {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, controller) {
            controller.$parsers.push(function (value) {
                var transformedInput = $filter('capitalizeFirst')(value);
                if (transformedInput !== value) {
                    var el = element[0];
                    el.setSelectionRange(el.selectionStart, el.selectionEnd);
                    controller.$setViewValue(transformedInput);
                    controller.$render();
                }
                return transformedInput;
            });
        }
    };
}]);

这里是一个小提琴



Answer 7:

要解决这个问题,光标(从那里马克Rajcok的解决方案),你可以在你的方法开始存储元素[0] .selectionStart,然后确保元件复位[0] .selectionStart和元素[0] .selectionEnd到存储返回前值。 这应该捕捉的角度选择范围



Answer 8:

评论马克Rajcok解决方案:使用$ setViewValue时,再次触发解析器和验证。 如果你在你利用函数的开头添加的console.log语句,你会看到它打印两次。

我提出以下指导解决方案(其中ngModel是可选的):

.directive('capitalize', function() {
   return {
     restrict: 'A',
     require: '?ngModel',
     link: function(scope, element, attrs, ngModel) {
         var capitalize = function (inputValue) {
             return (inputValue || '').toUpperCase();
         }
         if(ngModel) {
             ngModel.$formatters.push(capitalize);
             ngModel._$setViewValue = ngModel.$setViewValue;
             ngModel.$setViewValue = function(val){
                 ngModel._$setViewValue(capitalize(val));
                 ngModel.$render();
             };
         }else {
             element.val(capitalize(element.val()));
             element.on("keypress keyup", function(){
                 scope.$evalAsync(function(){
                     element.val(capitalize(element.val()));
                 });
             });
         }
     }
   };
});


Answer 9:

下面是过滤器的codepen是大写的第一个字母: http://codepen.io/WinterJoey/pen/sfFaK

angular.module('CustomFilter', []).
  filter('capitalize', function() {
    return function(input, all) {
      return (!!input) ? input.replace(/([^\W_]+[^\s-]*) */g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}) : '';
    }
  });


Answer 10:

继唯一的CSS-答案,你总是可以使用Twitter的引导 :

<td class="text-capitalize">


Answer 11:

建立关马克Rajcok的解决方案; 考虑到该指令从事评估,只有当输入字段是很重要的,否则你会得到错误信息发射过,直到输入领域有第1个字符。 简单的办法有几个条件语句:一个的jsfiddle去与: https://jsfiddle.net/Ely_Liberov/Lze14z4g/2/

      .directive('capitalizeFirst', function(uppercaseFilter, $parse) {
      return {
        require: 'ngModel',
        link: function(scope, element, attrs, modelCtrl) {
            var capitalize = function(inputValue) {
              if (inputValue != null) {
              var capitalized = inputValue.charAt(0).toUpperCase() +
                inputValue.substring(1);
              if (capitalized !== inputValue) {
                 modelCtrl.$setViewValue(capitalized);
                 modelCtrl.$render();
              }
              return capitalized;
            }
          };
          var model = $parse(attrs.ngModel);
          modelCtrl.$parsers.push(capitalize);
          capitalize(model(scope));
        }
       };
    });


Answer 12:

用CSS-ONY答案的问题是,角模型不更新与图。 这是因为CSS只用于呈现后适用的造型。

下面的指令更新模型并记住光标位置

app.module.directive('myCapitalize', [ function () {
        'use strict';

    return {
        require: 'ngModel',
        restrict: "A",
        link: function (scope, elem, attrs, modelCtrl) {

            /* Watch the model value using a function */
            scope.$watch(function () {
                return modelCtrl.$modelValue;
            }, function (value) {

                /**
                 * Skip capitalize when:
                 * - the value is not defined.
                 * - the value is already capitalized.
                 */
                if (!isDefined(value) || isUpperCase(value)) {
                    return;
                }

                /* Save selection position */
                var start = elem[0].selectionStart;
                var end = elem[0].selectionEnd;

                /* uppercase the value */
                value = value.toUpperCase();

                /* set the new value in the modelControl */
                modelCtrl.$setViewValue(value);

                /* update the view */
                modelCtrl.$render();

                /* Reset the position of the cursor */
                elem[0].setSelectionRange(start, end);
            });

            /**
             * Check if the string is defined, not null (in case of java object usage) and has a length.
             * @param str {string} The string to check
             * @return {boolean} <code>true</code> when the string is defined
             */
            function isDefined(str) {
                return angular.isDefined(str) && str !== null && str.length > 0;
            }

            /**
             * Check if a string is upper case
             * @param str {string} The string to check
             * @return {boolean} <code>true</code> when the string is upper case
             */
            function isUpperCase(str) {
                return str === str.toUpperCase();
            }
        }
    };
}]);


Answer 13:

您可以使用所提供的大写的过滤器。

http://docs.angularjs.org/api/ng.filter:uppercase



Answer 14:

您可以使用纯CSS:

input { text-transform: capitalize; }



文章来源: How to autocapitalize the first character in an input field in AngularJS?