fix(select): invalidate when 'multiple, required and model is []`

When `multiple` attribute is set on a `<select>` control and the model value is an empty array,
we should invalidate the control.  Previously, this directive was using incorrect logic for
determining if the model was empty.

Closes #5337
This commit is contained in:
Caitlin Potter 2013-12-07 18:22:04 -05:00 committed by Pete Bacon Darwin
parent b2e472e7a2
commit 5c97731a22
2 changed files with 27 additions and 11 deletions

View file

@ -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);

View file

@ -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',