diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index d87fa5d3e0a4..3dbb5b8e52d5 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -221,18 +221,10 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { selectCtrl.init(ngModelCtrl, nullOption, unknownOption); // required validator - if (multiple && (attr.required || attr.ngRequired)) { - var requiredValidator = function(value) { - ngModelCtrl.$setValidity('required', !attr.required || (value && value.length)); - return value; + if (multiple) { + ngModelCtrl.$isEmpty = function(value) { + return !value || value.length === 0; }; - - ngModelCtrl.$parsers.push(requiredValidator); - ngModelCtrl.$formatters.unshift(requiredValidator); - - attr.$observe('required', function() { - requiredValidator(ngModelCtrl.$viewValue); - }); } if (optionsExp) setupAsOptions(scope, element, ngModelCtrl); diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index ac0cc70d758f..835919497a21 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -1215,6 +1215,30 @@ describe('select', function() { }); + it('should treat an empty array as invalid when `multiple` attribute used', function() { + createSelect({ + 'ng-model': 'value', + 'ng-options': 'item.name for item in values', + 'ng-required': 'required', + 'multiple': '' + }, true); + + scope.$apply(function() { + scope.value = []; + scope.values = [{name: 'A', id: 1}, {name: 'B', id: 2}]; + scope.required = true; + }); + expect(element).toBeInvalid(); + + scope.$apply(function() { + // ngModelWatch does not set objectEquality flag + // array must be replaced in order to trigger $formatters + scope.value = [scope.values[0]]; + }); + expect(element).toBeValid(); + }); + + it('should allow falsy values as values', function() { createSelect({ 'ng-model': 'value',