From ecf252fad6837d71a7a55a509f24090be49754e1 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Wed, 2 May 2012 00:33:00 -0700 Subject: [PATCH] fix(select): don't interfere with selection if not databound Closes #926 --- src/ng/directive/select.js | 23 ++++++++++++++++++----- test/ng/directive/selectSpec.js | 11 +++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index aa540828030d..dda59375638b 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -126,13 +126,17 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { return { restrict: 'E', require: ['select', '?ngModel'], - controller: ['$element', '$scope', function($element, $scope) { + controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) { var self = this, optionsMap = {}, ngModelCtrl = nullModelCtrl, nullOption, unknownOption; + + self.databound = $attrs.ngModel; + + self.init = function(ngModelCtrl_, nullOption_, unknownOption_) { ngModelCtrl = ngModelCtrl_; nullOption = nullOption_; @@ -509,6 +513,11 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { }]; var optionDirective = ['$interpolate', function($interpolate) { + var nullSelectCtrl = { + addOption: noop, + removeOption: noop + }; + return { restrict: 'E', priority: 100, @@ -521,11 +530,15 @@ var optionDirective = ['$interpolate', function($interpolate) { } } - // For some reason Opera defaults to true and if not overridden this messes up the repeater. - // We don't want the view to drive the initialization of the model anyway. - element.prop('selected', false); - return function (scope, element, attr, selectCtrl) { + if (selectCtrl.databound) { + // For some reason Opera defaults to true and if not overridden this messes up the repeater. + // We don't want the view to drive the initialization of the model anyway. + element.prop('selected', false); + } else { + selectCtrl = nullSelectCtrl; + } + if (interpolateFn) { scope.$watch(interpolateFn, function(newVal, oldVal) { attr.$set('value', newVal); diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index d8fe150aa302..321990e80d18 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -61,6 +61,17 @@ describe('select', function() { }); + it('should not interfere with selection via selected attr if ngModel directive is not present', + function() { + compile(''); + expect(element).toEqualSelect('not me', ['me!'], 'nah'); + }); + + it('should require', function() { compile( '