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', {