diff options
| -rw-r--r-- | src/directive/select.js | 10 | ||||
| -rw-r--r-- | test/directive/selectSpec.js | 10 | 
2 files changed, 19 insertions, 1 deletions
diff --git a/src/directive/select.js b/src/directive/select.js index 9ea0186d..b70339fc 100644 --- a/src/directive/select.js +++ b/src/directive/select.js @@ -174,6 +174,7 @@ var selectDirective = ['$compile', '$parse', function($compile,   $parse) {        }        function Multiple(scope, selectElement, ctrl) { +        var lastView;          ctrl.$render = function() {            var items = new HashMap(ctrl.$viewValue);            forEach(selectElement.children(), function(option) { @@ -181,6 +182,15 @@ var selectDirective = ['$compile', '$parse', function($compile,   $parse) {            });          }; +        // we have to do it on each watch since ng-model watches reference, but +        // we need to work of an array, so we need to see if anything was inserted/removed +        scope.$watch(function() { +          if (!equals(lastView, ctrl.$viewValue)) { +            lastView = copy(ctrl.$viewValue); +            ctrl.$render(); +          } +        }); +          selectElement.bind('change', function() {            scope.$apply(function() {              var array = []; diff --git a/test/directive/selectSpec.js b/test/directive/selectSpec.js index e374fbe1..3f8fb56e 100644 --- a/test/directive/selectSpec.js +++ b/test/directive/selectSpec.js @@ -102,7 +102,15 @@ describe('select', function() {          scope.selection = ['A'];        }); -      expect(element[0].childNodes[0].selected).toEqual(true); +      expect(element.find('option')[0].selected).toEqual(true); +      expect(element.find('option')[1].selected).toEqual(false); + +      scope.$apply(function() { +        scope.selection.push('B'); +      }); + +      expect(element.find('option')[0].selected).toEqual(true); +      expect(element.find('option')[1].selected).toEqual(true);      });  | 
