From f2d6e3246a1c6bc468a8eac2d1230c538c58bcf0 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 30 Dec 2013 21:30:49 -0500 Subject: [PATCH] fix($location): ensure $locationChangeStart broadcast during $digest I'm not totally convinced this is a necessary change (see comments on #5118). However, feedback valuable. I'll amend this message if it becomes clear that it's a worthwhile change. --- src/ng/location.js | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/ng/location.js b/src/ng/location.js index 12f6c14cc0cb..af5adec26d41 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -656,21 +656,30 @@ function $LocationProvider(){ $browser.url($location.absUrl(), true); } + function browserUrlChange(newUrl) { + if ($rootScope.$broadcast('$locationChangeStart', newUrl, + $location.absUrl()).defaultPrevented) { + $browser.url($location.absUrl()); + return; + } + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + + $location.$$parse(newUrl); + afterLocationChange(oldUrl); + }); + } + // update $location when $browser url changes $browser.onUrlChange(function(newUrl) { if ($location.absUrl() != newUrl) { - if ($rootScope.$broadcast('$locationChangeStart', newUrl, - $location.absUrl()).defaultPrevented) { - $browser.url($location.absUrl()); - return; + if ($rootScope.$$phase) { + browserUrlChange(newUrl); + } else { + $rootScope.$apply(function() { + browserUrlChange(newUrl); + }); } - $rootScope.$evalAsync(function() { - var oldUrl = $location.absUrl(); - - $location.$$parse(newUrl); - afterLocationChange(oldUrl); - }); - if (!$rootScope.$$phase) $rootScope.$digest(); } });