angularjs 在文本框中强制大写

IT技术 javascript angularjs uppercase angularjs-filter
2021-03-22 14:22:00

我试过使用大写过滤器,但它不起作用。我试过两种方法:

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

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

第二个触发 javascript 错误:

语法错误:令牌“测试”是意外的,期待 [:]

我希望在用户在文本框中键入时将文本强制为大写。

我怎样才能做到这一点?

6个回答

请参阅下面的另一个答案,它优于这个答案。

这个答案基于这里的答案:How to autocapitalize the first character in an input field in 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>

将 push(capitalize) 更改为 unshift(capitalize),但除此之外它工作正常。谢谢。
2021-04-30 14:22:00
完美,这正是我需要的。我没有看到这个例子。我认为大写过滤器对我来说有点误导......谢谢
2021-05-09 14:22:00
这是一个方便的指令!但是,如果您在调用 inputValue 的方法之前测试其是否存在,这可能会有所帮助。
2021-05-13 14:22:00
您可以在渲染之前存储输入的 selectionStart 并在渲染后重置,因此每次按下按键后光标不会移动到字符串的末尾。 var selection = element[0].selectionStart; modelCtrl.$setViewValue(capitalized); modelCtrl.$render(); element[0].selectionStart = selection; element[0].selectionEnd = selection;
2021-05-13 14:22:00
+1 我被困了一个多小时试图找出原因$parsers并且$formatters没有更新输入控件。将调用添加到$setViewValue$render做到了。我将要求 Angular 团队将此添加到文档中。
2021-05-21 14:22:00

如果有人试图在现有字符串的开头输入小写字母,则接受的答案会导致问题。每次按下键后,光标都会移动到字符串的末尾。这是解决所有问题的简单解决方案:

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/

啊 - 不一定是指那个,不知何故错过了解析器。我略读了你的例子,我的思绪立即集中在应用于元素的文本转换上。我会打自己的手来略读而不是阅读:)
2021-04-23 14:22:00
然而需要注意的是,CSS text-transform 只是使屏幕上的文本大写,而绑定到模型的值不是。虽然接受的答案可能会产生其他意想不到的后果(例如光标撞到最后),但根据要求,这个答案也可能会产生。
2021-05-02 14:22:00
如果我错了,请纠正我,但我认为$(element)并且element是等效的。
2021-05-06 14:22:00
绑定到模型的值由 $parser 大写。还是你指的是 input 元素的 value 属性?在那种情况下,你是对的。
2021-05-20 14:22:00
请参阅此答案以保持占位符原样
2021-05-21 14:22:00

这个想法是在客户端将字符串显示(而不是转换)为大写,并在服务器端转换为大写(用户始终可以控制客户端发生的事情)。所以:

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 方法对于您的情况不是必需的。

现在这有效而且很简单!所以这是最好的事情!:) 谢谢 PS 我也使用了 ng-keydown 来确保用户更快地看到魔法:)
2021-05-07 14:22:00

您不能对 ng-model 进行过滤,因为它必须是可分配的。解决方法是解析器,或者只是 ng-change。

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

这应该有效。

完美运行
2021-04-29 14:22:00
到目前为止对我来说最好的解决方案!
2021-04-29 14:22:00
我会选择这个作为解决方案。简单和传递给后端的值也是大写的。
2021-05-04 14:22:00

与 Bootstrap 一起使用时,只需添加text-uppercase到输入的类属性。

您可以将引导类用于视觉目的,并在您的控制器中使用 toUperCase() 函数,然后再使用您的模型
2021-04-21 14:22:00
如果您想将模型更改为大写,您将需要使用模型控制器的 $parsers,如上所述。此解决方案仅是可视化的。
2021-05-09 14:22:00
你可以添加这个然后:::-webkit-input-placeholder { text-transform: none; } ::-moz-placeholder { text-transform: none; } :-ms-input-placeholder { text-transform: none; } input:-moz-placeholder { text-transform: none; }.text-uppercase如果需要,添加到这个类。
2021-05-14 14:22:00
它适用于用户界面,但模型值仍然是小写
2021-05-21 14:22:00