Skip to content

Commit 3387c3f

Browse files
committed
fix(ngMaxlength): ignore maxlength when not set to a non-negative integer
This makes the behaviour of maxlength/ngMaxlength more inline with the spec. Closes angular#9874
1 parent 0431ba3 commit 3387c3f

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

src/ng/directive/input.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -2610,9 +2610,10 @@ var maxlengthDirective = function() {
26102610
link: function(scope, elm, attr, ctrl) {
26112611
if (!ctrl) return;
26122612

2613-
var maxlength = 0;
2613+
var maxlength = -1;
26142614
attr.$observe('maxlength', function(value) {
2615-
maxlength = int(value) || 0;
2615+
var intVal = int(value);
2616+
maxlength = isNaN(intVal) ? -1 : intVal;
26162617
ctrl.$validate();
26172618
});
26182619
ctrl.$validators.maxlength = function(modelValue, viewValue) {

test/ng/directive/inputSpec.js

+31
Original file line numberDiff line numberDiff line change
@@ -2279,6 +2279,16 @@ describe('input', function() {
22792279
expect(inputElm).toBeValid();
22802280
});
22812281

2282+
it('should only accept empty values when maxlength is 0', function() {
2283+
compileInput('<input type="text" ng-model="value" ng-maxlength="0" />');
2284+
2285+
changeInputValueTo('');
2286+
expect(inputElm).toBeValid();
2287+
2288+
changeInputValueTo('a');
2289+
expect(inputElm).toBeInvalid();
2290+
});
2291+
22822292
it('should accept values of any length when maxlength is negative', function() {
22832293
compileInput('<input type="text" ng-model="value" ng-maxlength="-1" />');
22842294

@@ -2289,6 +2299,27 @@ describe('input', function() {
22892299
expect(inputElm).toBeValid();
22902300
});
22912301

2302+
it('should accept values of any length when maxlength is non-numeric', function() {
2303+
compileInput('<input type="text" ng-model="value" ng-maxlength="{{maxlength}}" />');
2304+
changeInputValueTo('aaaaaaaaaa');
2305+
2306+
scope.$apply('maxlength = "5"');
2307+
expect(inputElm).toBeInvalid();
2308+
2309+
scope.$apply('maxlength = "abc"');
2310+
expect(inputElm).toBeValid();
2311+
2312+
scope.$apply('maxlength = ""');
2313+
expect(inputElm).toBeValid();
2314+
2315+
scope.$apply('maxlength = null');
2316+
expect(inputElm).toBeValid();
2317+
2318+
scope.someObj = {};
2319+
scope.$apply('maxlength = someObj');
2320+
expect(inputElm).toBeValid();
2321+
});
2322+
22922323
it('should listen on ng-maxlength when maxlength is observed', function() {
22932324
var value = 0;
22942325
compileInput('<input type="text" ng-model="value" ng-maxlength="max" attr-capture />');

0 commit comments

Comments
 (0)