ng-maxlength
我已经通过 Angular 设置了一个 UI 页面,并且我正在尝试利用输入元素上的内置验证器。长话短说,我知道以及在验证失败的情况下该$scope.form.$error
对象如何具有属性。maxlength
但是我想显示一条特定于被违反的字符长度的错误消息,并且我没有看到我指定的长度存储在这个对象上的任何地方。有谁知道是否可以访问它,所以我不必为每个违反最大长度的输入写出单独的错误消息?
1 回答
编辑:要回答您的问题,是的,角度确实在 $error 对象中存储了一个布尔值,您可以通过对象中设置的键访问该布尔值。对于我在下面和 jsFiddle 中提供的代码,我们正在设置 angular 的键,以及 true 或 false 的值。
设置值时要小心,因为它是相反的。前任。$setValidity( true ),将 $error 翻转为 false。
好的,这就是我认为您正在寻找的...
在 Angularjs v1.2.13 中,您将无法访问 ng-message 或 $validator 管道,这就是使用 $formatters 和 $parsers 的原因。
在这种情况下,我使用命名输入,但也许在您的情况下您需要动态输入名称?
另外,如果您使用输入但没有表单,则必须使用单独的自定义指令来显示错误消息。
如果是这样,请在此处查找动态命名的输入字段以获取帮助。
让我知道这个是否奏效; 我会根据需要进行更改以连接您!
如果你不知道,你可以为每个单独的输入写 Angular 的 maxlength。
如果您将以下指令中 updateValidity() 函数中的“maxlength”更改为“butter”,则 $scope.form.inputname.$error 将类似于
$scope.formname.inputname.$error { butter: true }
if you also used ng-maxlength="true", then it would be
$scope.formname.inputname.$error { butter: true, maxlength: true }
Another example if you used ng-maxlength, and capitalized the 'maxlength' in the directive to 'Maxlength'
Then you would get
$scope.formname.inputname.$error { maxlength: true(angular maxlength), Maxlength: true(your maxlength)
And of course if you name it the same, then yours writes over angulars
$scope.formname.inputname.$error { maxlength: true };
关键是您可以将自己的名称添加到角度 $error 对象中;你可以写 Angular 的;当你使用 Angular 的指令时,你可以使用 Angular 给你的东西:比如 ng-required="true" 或 ng-maxlength="true"
链接到您在 jsFiddle 上的 angularjs 版本 jsFiddle 链接
<div ng-app="myApp">
<form name="myForm">
<div ng-controller="MyCtrl">
<br>
<label>Input #1</label>
<br>
<input ng-model="field.myName" name='myName' my-custom-length="8" />
<span ng-show="myForm.myName.$error.maxlength">
Max length exceeded by {{ myForm.myName.maxlength }}
</span>
<br>
<br>
<label>Input #2</label>
<br>
<input ng-model="field.myEmail" name='myEmail' my-custom-length="3" />
<span ng-show="myForm.myEmail.$error.maxlength">
Max length exceeded by {{ myForm.myEmail.maxlength }}
</span>
</div>
</form>
</div>
var app = angular.module('myApp', []);
app.controller('MyCtrl', function ($scope) {
$scope.field = {};
});
app.directive("myCustomLength", function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
if (!ctrl) { return } // ignore if no ngModel controller
ctrl.$formatters.push(validateInput);
ctrl.$parsers.unshift(validateInput);
function validateInput(value) {
if (!value) {
updateValidity(false);
return;
}
inputLength(value);
var state = value.length > attrs.myCustomLength;
updateValidity(state);
}
function inputLength(value) {
ctrl.maxlength = null;
var length = value.length > attrs.myCustomLength;
if (length) {
ctrl.maxlength = (value.length - attrs.myCustomLength).toString();
}
}
function updateValidity(state) {
ctrl.$setValidity('maxlength', !state);
}
} // end link
} // end return
});
如果需要,请点击 CSS。
input.ng-invalid {
border: 3px solid red !important;
}