Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit 171b7ed

Browse files
update(select): reduce locking of Select menu
References #3704.
1 parent 31bb121 commit 171b7ed

File tree

3 files changed

+39
-32
lines changed

3 files changed

+39
-32
lines changed

src/components/dialog/dialog.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ function MdDialogProvider($$interimElementProvider) {
563563
if (options.clickOutsideToClose) {
564564
var target = element;
565565
var clickHandler = function (ev) {
566-
// Only close if we click the flex container outside the backdrop
566+
// Only close if we click the flex container outside on the backdrop
567567
if (ev.target === target[0]) {
568568
ev.stopPropagation();
569569
ev.preventDefault();

src/components/select/select.js

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $mdAria, $interpolate,
306306

307307
scope.$on('$destroy', function() {
308308
if (isOpen) {
309-
$mdSelect.cancel().then(function() {
309+
$mdSelect.hide().finally(function() {
310310
selectContainer.remove();
311311
});
312312
} else {
@@ -361,19 +361,18 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $mdAria, $interpolate,
361361
}
362362

363363
function openSelect() {
364-
scope.$evalAsync(function() {
365-
isOpen = true;
366-
$mdSelect.show({
367-
scope: selectScope,
368-
preserveScope: true,
369-
skipCompile: true,
370-
element: selectContainer,
371-
target: element[0],
372-
hasBackdrop: true,
373-
loadingAsync: attr.mdOnOpen ? scope.$eval(attr.mdOnOpen) || true : false
374-
}).then(function(selectedText) {
375-
isOpen = false;
376-
});
364+
scope.$apply('isOpen = true');
365+
366+
$mdSelect.show({
367+
scope: selectScope,
368+
preserveScope: true,
369+
skipCompile: true,
370+
element: selectContainer,
371+
target: element[0],
372+
hasBackdrop: true,
373+
loadingAsync: attr.mdOnOpen ? scope.$eval(attr.mdOnOpen) || true : false
374+
}).then(function() {
375+
isOpen = false;
377376
});
378377
}
379378
};
@@ -749,7 +748,7 @@ function SelectProvider($$interimElementProvider) {
749748
});
750749

751750
/* @ngInject */
752-
function selectDefaultOptions($mdSelect, $mdConstant, $$rAF, $mdUtil, $mdTheming, $window ) {
751+
function selectDefaultOptions($mdSelect, $mdConstant, $$rAF, $mdUtil, $mdTheming, $window, $q, $log ) {
753752
var animator = $mdUtil.dom.animator;
754753

755754
return {
@@ -832,11 +831,10 @@ function SelectProvider($$interimElementProvider) {
832831
});
833832
});
834833

835-
return animator
836-
.waitTransitionEnd(opts.selectEl, {timeout: 370})
837-
.then(function(res) {
834+
return opts.isRemoved ? $q.reject(true) : animator
835+
.waitTransitionEnd(opts.selectEl, {timeout: 470})
836+
.finally(function() {
838837
activateInteraction();
839-
return res;
840838
});
841839

842840
function configureAria() {
@@ -849,10 +847,12 @@ function SelectProvider($$interimElementProvider) {
849847
element.addClass('md-clickable');
850848

851849
opts.backdrop && opts.backdrop.on('click', function(e) {
850+
$log.debug("backdrop click");
851+
852852
e.preventDefault();
853853
e.stopPropagation();
854854
opts.restoreFocus = false;
855-
scope.$apply($mdSelect.cancel);
855+
$mdUtil.nextTick($mdSelect.hide,true);
856856
});
857857

858858
// Escape to close
@@ -873,7 +873,7 @@ function SelectProvider($$interimElementProvider) {
873873
case $mdConstant.KEY_CODE.ESCAPE:
874874
ev.preventDefault();
875875
opts.restoreFocus = true;
876-
scope.$apply($mdSelect.cancel);
876+
$mdUtil.nextTick($mdSelect.hide,true);
877877
}
878878
});
879879

@@ -932,46 +932,53 @@ function SelectProvider($$interimElementProvider) {
932932
function checkCloseMenu() {
933933
if (!selectCtrl.isMultiple) {
934934
opts.restoreFocus = true;
935-
scope.$evalAsync(function() {
935+
936+
$mdUtil.nextTick(function() {
936937
$mdSelect.hide(selectCtrl.ngModel.$viewValue);
937-
});
938+
},true);
938939
}
939940
}
940941
}
941942

942943
}
943944

944945
function onRemove(scope, element, opts) {
945-
element
946-
.addClass('md-leave')
947-
.removeClass('md-clickable');
946+
opts.isRemoved = true;
948947

949948
opts.target.attr('aria-expanded', 'false');
950949
opts.selectEl.off('keydown');
951-
opts.isRemoved = true;
952950

953951
angular.element($window).off('resize', opts.resizeFn);
954952
angular.element($window).off('orientationchange', opts.resizefn);
955953
opts.resizeFn = undefined;
956954

955+
element
956+
.addClass('md-leave')
957+
.removeClass('md-clickable');
958+
957959
var mdSelect = opts.selectEl.controller('mdSelect');
958960
if (mdSelect) {
959-
mdSelect.setLabelText(opts.selectEl.controller('mdSelectMenu').selectedLabels());
961+
mdSelect.setLabelText(opts.selectEl
962+
.controller('mdSelectMenu')
963+
.selectedLabels()
964+
);
960965
}
961966

967+
opts.backdrop && opts.backdrop.remove();
968+
962969
return animator
963970
.waitTransitionEnd(element, { timeout: 370 })
964971
.finally(function() {
972+
mdSelect && mdSelect.triggerClose();
973+
965974
element.removeClass('md-active');
966-
opts.backdrop && opts.backdrop.remove();
967975
if (element[0].parentNode === opts.parent[0]) {
968976
opts.parent[0].removeChild(element[0]); // use browser to avoid $destroy event
969977
}
970978
if (opts.disableParentScroll) {
971979
opts.restoreScroll();
972980
}
973981
if (opts.restoreFocus) opts.target.focus();
974-
mdSelect && mdSelect.triggerClose();
975982
});
976983
}
977984

src/core/services/interimElement/interimElement.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ function InterimElementProvider() {
420420

421421
return $q.when(ret).finally(function() {
422422
if (!options.preserveScope) options.scope.$destroy();
423-
removeDone = true;
423+
return removeDone = true;
424424
});
425425
});
426426
}

0 commit comments

Comments
 (0)