From 3bd3cc571dcd721f9d71f971aefee23115a5e458 Mon Sep 17 00:00:00 2001
From: Igor Minar
Date: Wed, 2 May 2012 00:33:00 -0700
Subject: 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 aa540828..dda59375 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 d8fe150a..321990e8 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(
'