Угловая сила в верхнем регистре в текстовом поле
Я пробовал использовать фильтр верхнего регистра, но он не работает. Я пробовал сделать это двумя способами:
<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) ...