diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index ed7400d570bc..0c8201068c29 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -281,7 +281,7 @@ var SelectController = var removeValue = optionAttrs.value; self.removeOption(removeValue); - self.ngModelCtrl.$render(); + scheduleRender(); if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 || currentValue === removeValue diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index 9596d3b4d792..e77d5bffcf3f 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -2316,6 +2316,40 @@ describe('select', function() { }); + it('should keep the ngModel value when the selected option is recreated by ngRepeat', function() { + scope.options = [{ name: 'A'}, { name: 'B'}, { name: 'C'}]; + scope.obj = { + value: 'B' + }; + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(optionElements[0].value).toBe('A'); + expect(optionElements[1]).toBeMarkedAsSelected(); + expect(scope.obj.value).toBe('B'); + + scope.$apply(function() { + // Only when new objects are used, ngRepeat re-creates the element from scratch + scope.options = [{ name: 'B'}, { name: 'C'}, { name: 'D'}]; + }); + + var previouslySelectedOptionElement = optionElements[1]; + optionElements = element.find('option'); + + expect(optionElements.length).toEqual(3); + expect(optionElements[0].value).toBe('B'); + expect(optionElements[0]).toBeMarkedAsSelected(); + expect(scope.obj.value).toBe('B'); + // Ensure the assumption that the element is re-created is true + expect(previouslySelectedOptionElement).not.toBe(optionElements[0]); + }); + });