fix(select): make ctrl.hasOption method consistent

Prior to this fix, options added to a select by ngOptions would not cause
`selectCtrl.hasOption` to return `true`

Closes #8761
This commit is contained in:
Brian Ford
2014-09-24 15:33:35 -07:00
parent b0033a44bd
commit 2bcd02dc1a
2 changed files with 70 additions and 1 deletions

View File

@@ -611,6 +611,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
id: option.id,
selected: option.selected
});
selectCtrl.addOption(option.label, element);
if (lastElement) {
lastElement.after(element);
} else {
@@ -622,7 +623,9 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
// remove any excessive OPTIONs in a group
index++; // increment since the existingOptions[0] is parent element not OPTION
while(existingOptions.length > index) {
existingOptions.pop().element.remove();
option = existingOptions.pop();
selectCtrl.removeOption(option.label);
option.element.remove();
}
}
// remove any excessive OPTGROUPs from select

View File

@@ -405,6 +405,39 @@ describe('select', function() {
expect(element).toEqualSelect(['? string:r2d2 ?']);
expect(scope.robot).toBe('r2d2');
});
describe('selectController.hasOption', function() {
it('should return true for options added via ngOptions', function() {
scope.robots = [
{key: 1, value: 'c3p0'},
{key: 2, value: 'r2d2'}
];
scope.robot = 'r2d2';
compile('<select ng-model="robot" ' +
'ng-options="item.key as item.value for item in robots">' +
'</select>');
var selectCtrl = element.data().$selectController;
expect(selectCtrl.hasOption('c3p0')).toBe(true);
expect(selectCtrl.hasOption('r2d2')).toBe(true);
scope.$apply(function() {
scope.robots.pop();
});
expect(selectCtrl.hasOption('c3p0')).toBe(true);
expect(selectCtrl.hasOption('r2d2')).toBe(false);
scope.$apply(function() {
scope.robots.push({key: 2, value: 'r2d2'});
});
expect(selectCtrl.hasOption('c3p0')).toBe(true);
expect(selectCtrl.hasOption('r2d2')).toBe(true);
});
});
});
});
});
@@ -481,6 +514,39 @@ describe('select', function() {
expect(element).toBeValid();
expect(element).toBeDirty();
});
describe('selectController.hasOption', function() {
it('should return true for options added via ngOptions', function() {
scope.robots = [
{key: 1, value: 'c3p0'},
{key: 2, value: 'r2d2'}
];
scope.robot = 'r2d2';
compile('<select ng-model="robot" multiple ' +
'ng-options="item.key as item.value for item in robots">' +
'</select>');
var selectCtrl = element.data().$selectController;
expect(selectCtrl.hasOption('c3p0')).toBe(true);
expect(selectCtrl.hasOption('r2d2')).toBe(true);
scope.$apply(function() {
scope.robots.pop();
});
expect(selectCtrl.hasOption('c3p0')).toBe(true);
expect(selectCtrl.hasOption('r2d2')).toBe(false);
scope.$apply(function() {
scope.robots.push({key: 2, value: 'r2d2'});
});
expect(selectCtrl.hasOption('c3p0')).toBe(true);
expect(selectCtrl.hasOption('r2d2')).toBe(true);
});
});
});