mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-01-12 22:45:52 +08:00
fix(select): don't interfere with selection if not databound
Closes #926
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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()">' +
|
||||
|
||||
Reference in New Issue
Block a user