From b54f7ede9107a2194d48ef0f1445806491f8bd97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Kr=C4=99tkowski?= Date: Tue, 22 Mar 2016 21:45:00 +0100 Subject: [PATCH] fix(mdSelect): fix flickering of ngMessages on mdSelect opening To properly prevent ngMessages from showing up on select opening, we have to stop blur event propagation to ngModel listener. To be close to mdInput behaviour, we do it only, when mdSelect was opened. closes #7636 Closes #7646 --- src/components/select/select.js | 22 +++++++++++----------- src/components/select/select.spec.js | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/components/select/select.js b/src/components/select/select.js index 6d91ca87bd0..ac9a718ad10 100755 --- a/src/components/select/select.js +++ b/src/components/select/select.js @@ -286,19 +286,19 @@ function SelectDirective($mdSelect, $mdUtil, $mdTheming, $mdAria, $compile, $par } }); - // Wait until postDigest so that we attach after ngModel's - // blur listener so we can set untouched. - $mdUtil.nextTick(function () { - element.on('blur', function() { - if (untouched) { - untouched = false; - ngModelCtrl.$setUntouched(); + // Attach before ngModel's blur listener to stop propagation of blur event + // to prevent from setting $touched. + element.on('blur', function(event) { + if (untouched) { + untouched = false; + if (selectScope.isOpen) { + event.stopImmediatePropagation(); } + } - if (selectScope.isOpen) return; - containerCtrl && containerCtrl.setFocused(false); - inputCheckValue(); - }); + if (selectScope.isOpen) return; + containerCtrl && containerCtrl.setFocused(false); + inputCheckValue(); }); } diff --git a/src/components/select/select.spec.js b/src/components/select/select.spec.js index 6fa5158d237..95553747850 100755 --- a/src/components/select/select.spec.js +++ b/src/components/select/select.spec.js @@ -158,6 +158,23 @@ describe('', function() { expect($rootScope.myForm.select.$touched).toBe(true); })); + it('should remain untouched during opening', inject(function($compile, $rootScope) { + var form = $compile('
' + + '' + + '1' + + '' + + '
')($rootScope); + var unwatch = $rootScope.$watch('myForm.select.$touched', + function(touched) { + expect(touched).toBe(false); + }); + var select = form.find('md-select'); + openSelect(select); + unwatch(); + closeSelect(); + expect($rootScope.myForm.select.$touched).toBe(true); + })); + it('restores focus to select when the menu is closed', inject(function($document) { var select = setupSelect('ng-model="val"').find('md-select'); openSelect(select);