fix(select): don't interfere with selection if not databound

Closes #926
This commit is contained in:
Igor Minar
2012-05-02 00:33:00 -07:00
parent c7f1101520
commit 3bd3cc571d
2 changed files with 29 additions and 5 deletions

View File

@@ -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);

View File

@@ -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()">' +