diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js
index 149d0bb96a69..7eca8a888dd8 100644
--- a/src/ngRoute/route.js
+++ b/src/ngRoute/route.js
@@ -17,7 +17,11 @@
*/
/* global -ngRouteModule */
var ngRouteModule = angular.module('ngRoute', ['ng']).
- provider('$route', $RouteProvider),
+ provider('$route', $RouteProvider).
+ // Ensure `$route` will be instantiated in time to capture the initial
+ // `$locationChangeSuccess` event. This is necessary in case `ngView` is
+ // included in an asynchronously loaded template.
+ run(['$route', angular.noop]),
$routeMinErr = angular.$$minErr('ngRoute');
/**
diff --git a/test/ngRoute/directive/ngViewSpec.js b/test/ngRoute/directive/ngViewSpec.js
index bb5a64951fa7..8cc3d5195465 100644
--- a/test/ngRoute/directive/ngViewSpec.js
+++ b/test/ngRoute/directive/ngViewSpec.js
@@ -1027,3 +1027,34 @@ describe('ngView animations', function() {
));
});
});
+
+describe('ngView in async template', function() {
+ beforeEach(module('ngRoute'));
+ beforeEach(module(function($compileProvider, $provide, $routeProvider) {
+ $compileProvider.directive('asyncView', function() {
+ return {templateUrl: 'async-view.html'};
+ });
+
+ $provide.decorator('$templateRequest', function($timeout) {
+ return function() {
+ return $timeout(angular.identity, 500, false, '');
+ };
+ });
+
+ $routeProvider.when('/', {template: 'Hello, world !'});
+ }));
+
+
+ it('should work correctly upon initial page load',
+ // Injecting `$location` here is necessary, so that it gets instantiated early
+ inject(function($compile, $location, $rootScope, $timeout) {
+ var elem = $compile('')($rootScope);
+ $rootScope.$digest();
+ $timeout.flush(500);
+
+ expect(elem.text()).toBe('Hello, world !');
+
+ dealoc(elem);
+ })
+ );
+});
diff --git a/test/ngRoute/routeSpec.js b/test/ngRoute/routeSpec.js
index 889489a0d63d..4c6f6c1541a7 100644
--- a/test/ngRoute/routeSpec.js
+++ b/test/ngRoute/routeSpec.js
@@ -23,6 +23,21 @@ describe('$route', function() {
dealoc(element);
});
+ it('should be loaded upon initial load (even if `ngView` is loaded async)', function() {
+ module(function($routeProvider) {
+ $routeProvider.when('/', {template: 'Hello, world !'});
+ });
+
+ inject(function($location, $rootScope) {
+ $location.path('/');
+ $rootScope.$digest();
+ });
+
+ inject(function($route) {
+ expect($route.current).toBeDefined();
+ });
+ });
+
it('should allow cancellation via $locationChangeStart via $routeChangeStart', function() {
module(function($routeProvider) {
$routeProvider.when('/Edit', {