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(
'