Skip to content

Commit 16a6015

Browse files
maxfierkefernando-sendMail
authored andcommitted
fix(dropdown): Fix $digest:inprog on dropdown dismissal
Make $apply first check if $rootScope is in $digest cycle before executing Closes angular-ui#3274
1 parent 239ca7e commit 16a6015

File tree

2 files changed

+3
-485
lines changed

2 files changed

+3
-485
lines changed

Diff for: src/dropdown/dropdown.js

+3-50
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
1+
angular.module('ui.bootstrap.dropdown', [])
22

33
.constant('dropdownConfig', {
44
openClass: 'open'
@@ -33,18 +33,11 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
3333
// unbound this event handler. So check openScope before proceeding.
3434
if (!openScope) { return; }
3535

36-
if( evt && openScope.getAutoClose() === 'disabled' ) { return ; }
37-
3836
var toggleElement = openScope.getToggleElement();
3937
if ( evt && toggleElement && toggleElement[0].contains(evt.target) ) {
4038
return;
4139
}
4240

43-
var $element = openScope.getElement();
44-
if( evt && openScope.getAutoClose() === 'outsideClick' && $element && $element[0].contains(evt.target) ) {
45-
return;
46-
}
47-
4841
openScope.isOpen = false;
4942

5043
if (!$rootScope.$$phase) {
@@ -60,14 +53,13 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
6053
};
6154
}])
6255

63-
.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', '$position', '$document', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate, $position, $document) {
56+
.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) {
6457
var self = this,
6558
scope = $scope.$new(), // create a child scope so we are not polluting original one
6659
openClass = dropdownConfig.openClass,
6760
getIsOpen,
6861
setIsOpen = angular.noop,
69-
toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop,
70-
appendToBody = false;
62+
toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop;
7163

7264
this.init = function( element ) {
7365
self.$element = element;
@@ -80,15 +72,6 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
8072
scope.isOpen = !!value;
8173
});
8274
}
83-
84-
appendToBody = angular.isDefined($attrs.dropdownAppendToBody);
85-
86-
if ( appendToBody && self.dropdownMenu ) {
87-
$document.find('body').append( self.dropdownMenu );
88-
element.on('$destroy', function handleDestroyEvent() {
89-
self.dropdownMenu.remove();
90-
});
91-
}
9275
};
9376

9477
this.toggle = function( open ) {
@@ -104,30 +87,13 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
10487
return self.toggleElement;
10588
};
10689

107-
scope.getAutoClose = function() {
108-
return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled'
109-
};
110-
111-
scope.getElement = function() {
112-
return self.$element;
113-
};
114-
11590
scope.focusToggleElement = function() {
11691
if ( self.toggleElement ) {
11792
self.toggleElement[0].focus();
11893
}
11994
};
12095

12196
scope.$watch('isOpen', function( isOpen, wasOpen ) {
122-
if ( appendToBody && self.dropdownMenu ) {
123-
var pos = $position.positionElements(self.$element, self.dropdownMenu, 'bottom-left', true);
124-
self.dropdownMenu.css({
125-
top: pos.top + 'px',
126-
left: pos.left + 'px',
127-
display: isOpen ? 'block' : 'none'
128-
});
129-
}
130-
13197
$animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass);
13298

13399
if ( isOpen ) {
@@ -161,19 +127,6 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
161127
};
162128
})
163129

164-
.directive('dropdownMenu', function() {
165-
return {
166-
restrict: 'AC',
167-
require: '?^dropdown',
168-
link: function(scope, element, attrs, dropdownCtrl) {
169-
if ( !dropdownCtrl ) {
170-
return;
171-
}
172-
dropdownCtrl.dropdownMenu = element;
173-
}
174-
};
175-
})
176-
177130
.directive('dropdownToggle', function() {
178131
return {
179132
require: '?^dropdown',

0 commit comments

Comments
 (0)