diff options
| author | Igor Minar | 2012-05-02 00:33:00 -0700 | 
|---|---|---|
| committer | Igor Minar | 2012-05-02 14:24:43 -0700 | 
| commit | 3bd3cc571dcd721f9d71f971aefee23115a5e458 (patch) | |
| tree | 015d9745865329ab5feca8780ef85f9f95aab498 | |
| parent | c7f11015205835e83d935417e3342a18fe23c3fa (diff) | |
| download | angular.js-3bd3cc571dcd721f9d71f971aefee23115a5e458.tar.bz2 | |
fix(select): don't interfere with selection if not databound
Closes #926
| -rw-r--r-- | src/ng/directive/select.js | 23 | ||||
| -rw-r--r-- | 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('<select>' + +                '<option>not me</option>' + +                '<option selected>me!</option>' + +                '<option>nah</option>' + +              '</select>'); +      expect(element).toEqualSelect('not me', ['me!'], 'nah'); +    }); + +      it('should require', function() {        compile(          '<select name="select" ng-model="selection" required ng-change="change()">' +  | 
