diff --git a/src/components/input/input.js b/src/components/input/input.js index 14b52e4b3ef..6949c2db69c 100644 --- a/src/components/input/input.js +++ b/src/components/input/input.js @@ -642,6 +642,10 @@ function mdMaxlengthDirective($animate, $mdUtil) { var ngTrim = angular.isDefined(attr.ngTrim) ? $mdUtil.parseAttributeBoolean(attr.ngTrim) : true; var isPasswordInput = attr.type === 'password'; + scope.$watch(attr.mdMaxlength, function(value) { + maxlength = value; + }); + ngModelCtrl.$validators['md-maxlength'] = function(modelValue, viewValue) { if (!angular.isNumber(maxlength) || maxlength < 0) { return true; @@ -685,7 +689,6 @@ function mdMaxlengthDirective($animate, $mdUtil) { }); scope.$watch(attr.mdMaxlength, function(value) { - maxlength = value; if (angular.isNumber(value) && value > 0) { if (!charCountEl.parent().length) { $animate.enter(charCountEl, errorsSpacer); diff --git a/src/components/input/input.spec.js b/src/components/input/input.spec.js index 86962342f7f..bb7277da400 100644 --- a/src/components/input/input.spec.js +++ b/src/components/input/input.spec.js @@ -291,6 +291,42 @@ describe('md-input-container directive', function() { expect(getCharCounter(el).text()).toBe('5 / 5'); }); + it('should error with an interpolated value and incorrect initial value', function() { + var el = $compile( + '
' + + ' ' + + ' ' + + ' ' + + '
')(pageScope); + + pageScope.$apply('mymax = 8'); + pageScope.$apply('foo = "ABCDEFGHIJ"'); + + // Flush any pending $mdUtil.nextTick calls + $timeout.flush(); + + expect(pageScope.form.foo.$error['md-maxlength']).toBe(true); + expect(getCharCounter(el).text()).toBe('10 / 8'); + }); + + it('should work with an interpolated value and correct initial value', function() { + var el = $compile( + '
' + + ' ' + + ' ' + + ' ' + + '
')(pageScope); + + pageScope.$apply('mymax = 5'); + pageScope.$apply('foo = "abcde"'); + + // Flush any pending $mdUtil.nextTick calls + $timeout.flush(); + + expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy(); + expect(getCharCounter(el).text()).toBe('5 / 5'); + }); + it('should work with a constant', function() { var el = $compile( '
' +