aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/directive/select.js10
-rw-r--r--test/directive/selectSpec.js10
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);
});