我尝试过使用大写过滤器,但它不起作用。我已经尝试了两种方式:
<input type="text" ng-model="test" uppercase/>
和
<input type="text" ng-model="{{test | uppercase}}"/>
第二个触发JavaScript错误:
语法错误:令牌“test”不是预期的,需要[:]
我希望在用户输入文本框时将文本强制转换为大写。
我该如何做到这一点?
我尝试过使用大写过滤器,但它不起作用。我已经尝试了两种方式:
<input type="text" ng-model="test" uppercase/>
和
<input type="text" ng-model="{{test | uppercase}}"/>
第二个触发JavaScript错误:
语法错误:令牌“test”不是预期的,需要[:]
我希望在用户输入文本框时将文本强制转换为大写。
我该如何做到这一点?
请看下面的答案,那个更好一些。
这个答案是基于这里的答案:如何在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>
如果有人尝试在现有字符串开头输入小写字母,则被接受的答案会引起问题。每次按键后,光标都会移动到字符串的末尾。以下是一个简单的解决方案,可以解决所有问题:
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/
这个想法是在客户端以大写形式显示(而不是转换)字符串,并在服务器端将其转换为大写形式(用户始终可以控制客户端发生的情况)。因此:
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方式并不必要。
由于ng-model必须是可分配的,因此无法对其进行过滤。解决方法要么是使用解析器,要么就是使用ng-change。
<input ng-model="some" ng-change="some = (some | uppercase)" />
这应该可以运行。
使用Bootstrap时,只需将text-uppercase
添加到输入框的class属性中即可。
::-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
添加到这些类中。 - Ludovic Guillaumeone 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();
}
。它涉及到IT技术。
ng-pattern
。你有什么办法让两者都能正常工作吗?https://jsfiddle.net/630dkL15/ - SpaceNinja这样做完全行不通。
ng-model
用于指定将从作用域中绑定到模型的字段/属性。此外,ng-model
不接受表达式作为值。在 angular.js 中,表达式是指 {{
和 }}
之间的内容。
可以在输出中和所有允许使用表达式的地方使用 uppercase
过滤器。
无法实现您想要的操作,但您可以使用 CSS 的 text-transform
至少将所有内容显示为大写。
如果您想要文本字段的值为大写字母,则可以使用一些自定义 JavaScript 实现此目的。
在您的控制器中:
$scope.$watch('test', function(newValue, oldValue) {
$scope.$apply(function() {
$scope.test = newValue.toUpperCase();
}
});
不要忘记在你的模块中包含 '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
}
};
});
请注意 "require: '?ngModel'," 中的 "?",只有这样我的应用程序才能正常工作。
"if(inputValue) {...}" 以避免未定义错误的发生
使用Bootstrap时:
第一种方法:使用class text-uppercase
<input type="text" class="text-uppercase" >
<input type="text" class="form-control" style="text-transform: uppercase;">
这是我的 StackBlitz:https://angular-nvd7v6forceuppercase.stackblitz.io
解决光标偏移问题的解决方案
.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
}
};
});
$parsers
和$formatters
没有更新输入控件。添加调用$setViewValue
和$render
解决了问题。我将要求Angular团队将此添加到文档中。 - ReactgularmodelCtrl.$setViewValue(capitalized); modelCtrl.$render(); element[0].selectionStart = selection; element[0].selectionEnd = selection;
- rucsi