diff --git a/CHANGELOG.md b/CHANGELOG.md index e833ba786cae..52ac5c6314eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Bug Fixes - Issue #449: [ng:options] should support binding to a property of an item. +- Issue #464: [ng:options] incorrectly re-grew options on datasource change ### Breaking changes - no longer support MMMMM in filter.date as we need to follow UNICODE LOCALE DATA formats. diff --git a/src/widgets.js b/src/widgets.js index 8fa8db4ad19c..f8ada6676209 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -783,10 +783,13 @@ angularWidget('select', function(element){ } } } - if (fragment) select.append(jqLite(fragment)); + if (fragment) { + select.append(jqLite(fragment)); + } // shrink children while(optionElements.length > index) { optionElements.pop().remove(); + optionTexts.pop(); delete lastSelectValue[optionElements.length]; } diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 5d39b4ecfe72..342dc8c51d0f 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -672,6 +672,24 @@ describe("widget", function(){ expect(select.find('option').length).toEqual(1); // we add back the special empty option }); + it('should shrink and then grow list', function(){ + createSingleSelect(); + scope.values = [{name:'A'}, {name:'B'}, {name:'C'}]; + scope.selected = scope.values[0]; + scope.$eval(); + expect(select.find('option').length).toEqual(3); + + scope.values = [{name:'1'}, {name:'2'}]; + scope.selected = scope.values[0]; + scope.$eval(); + expect(select.find('option').length).toEqual(2); + + scope.values = [{name:'A'}, {name:'B'}, {name:'C'}]; + scope.selected = scope.values[0]; + scope.$eval(); + expect(select.find('option').length).toEqual(3); + }); + it('should update list', function(){ createSingleSelect(); scope.values = [{name:'A'}, {name:'B'}, {name:'C'}];