diff --git a/src/ng/browser.js b/src/ng/browser.js index 8bd6b424bff8..fbebe01b3b8b 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -135,6 +135,26 @@ function Browser(window, document, $log, $sniffer) { cacheState(); lastHistoryState = cachedState; + /** + * @name $browser#forceReloadLocationUpdate + * + * @description + * This method is a setter. + * + * If the reloadLocation variable is already set, it will be reset to + * the passed-in URL. + * + * NOTE: this api is intended for use only by the $location service in the + * $locationWatch function. + * + * @param {string} url New url + */ + self.forceReloadLocationUpdate = function(url) { + if (reloadLocation) { + reloadLocation = url; + } + }; + /** * @name $browser#url * diff --git a/src/ng/location.js b/src/ng/location.js index ffee4cd4820f..5c24f66534c2 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -883,7 +883,7 @@ function $LocationProvider() { $browser.url($location.absUrl(), true); } - var initializing = true; + var initializing = true, previousOldUrl = null, previousNewUrl = null; // update $location when $browser url changes $browser.onUrlChange(function(newUrl, newState) { @@ -918,6 +918,14 @@ function $LocationProvider() { $rootScope.$watch(function $locationWatch() { var oldUrl = trimEmptyHash($browser.url()); var newUrl = trimEmptyHash($location.absUrl()); + if ($location.$$html5 && !$sniffer.history && + (previousOldUrl === oldUrl) && (previousNewUrl === newUrl)) { + // break out of infinite $digest loops caused by default routes in hashbang mode + $browser.forceReloadLocationUpdate(newUrl); + previousOldUrl = previousNewUrl = null; + return; + } + previousOldUrl = oldUrl, previousNewUrl = newUrl; var oldState = $browser.state(); var currentReplace = $location.$$replace; var urlOrStateChanged = oldUrl !== newUrl || @@ -944,6 +952,9 @@ function $LocationProvider() { oldState === $location.$$state ? null : $location.$$state); } afterLocationChange(oldUrl, oldState); + //if ($location.$$html5 && $location.absUrl().indexOf("#") > -1 && $location.absUrl() !== $browser.url()) { + // $browser.forceReloadLocationUpdate($location.absUrl()); + //} } }); }