aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/content/cookbook/deeplinking.ngdoc13
-rw-r--r--src/service/route.js30
-rw-r--r--src/service/scope.js2
-rw-r--r--src/widgets.js41
-rw-r--r--test/service/routeSpec.js14
-rw-r--r--test/widgetsSpec.js12
6 files changed, 67 insertions, 45 deletions
diff --git a/docs/content/cookbook/deeplinking.ngdoc b/docs/content/cookbook/deeplinking.ngdoc
index 1d6d196b..4db8d1c7 100644
--- a/docs/content/cookbook/deeplinking.ngdoc
+++ b/docs/content/cookbook/deeplinking.ngdoc
@@ -36,16 +36,17 @@ The two partials are defined in the following URLs:
* <a href="./examples/settings.html" ng:ext-link>./examples/settings.html</a>
* <a href="./examples/welcome.html" ng:ext-link>./examples/welcome.html</a>
-<doc:example>
+<doc:example module="deepLinking">
<doc:source jsfiddle="false">
<script>
+ angular.module('deepLinking', [])
+ .config(function($routeProvider) {
+ $routeProvider.when("/welcome", {template:'./examples/welcome.html', controller:WelcomeCntl});
+ $routeProvider.when("/settings", {template:'./examples/settings.html', controller:SettingsCntl});
+ });
+
AppCntl.$inject = ['$scope', '$route']
function AppCntl($scope, $route) {
- // define routes
- $route.when("/welcome", {template:'./examples/welcome.html', controller:WelcomeCntl});
- $route.when("/settings", {template:'./examples/settings.html', controller:SettingsCntl});
- $route.parent($scope);
-
// initialize the model to something useful
$scope.person = {
name:'anonymous',
diff --git a/src/service/route.js b/src/service/route.js
index 7cdcfd05..b7f8bd02 100644
--- a/src/service/route.js
+++ b/src/service/route.js
@@ -135,8 +135,8 @@ function $RouteProvider(){
};
- this.$get = ['$rootScope', '$location', '$routeParams', '$controller',
- function( $rootScope, $location, $routeParams, $controller) {
+ this.$get = ['$rootScope', '$location', '$routeParams',
+ function( $rootScope, $location, $routeParams) {
/**
* @ngdoc event
* @name angular.module.ng.$route#$beforeRouteChange
@@ -185,7 +185,6 @@ function $RouteProvider(){
*/
var matcher = switchRouteMatcher,
- parentScope = $rootScope,
dirty = 0,
forceReload = false,
$route = {
@@ -193,22 +192,6 @@ function $RouteProvider(){
/**
* @ngdoc method
- * @name angular.module.ng.$route#parent
- * @methodOf angular.module.ng.$route
- *
- * @param {Scope} [scope=rootScope] Scope to be used as parent for newly created
- * `$route.current.scope` scopes.
- *
- * @description
- * Sets a scope to be used as the parent scope for scopes created on route change. If not
- * set, defaults to the root scope.
- */
- parent: function(scope) {
- if (scope) parentScope = scope;
- },
-
- /**
- * @ngdoc method
* @name angular.module.ng.$route#reload
* @methodOf angular.module.ng.$route
*
@@ -266,7 +249,10 @@ function $RouteProvider(){
} else {
forceReload = false;
$rootScope.$broadcast('$beforeRouteChange', next, last);
- last && last.scope && last.scope.$destroy();
+ if (last && last.scope) {
+ last.scope.$destroy();
+ last.scope = null;
+ }
$route.current = next;
if (next) {
if (next.redirectTo) {
@@ -279,10 +265,6 @@ function $RouteProvider(){
}
} else {
copy(next.params, $routeParams);
- next.scope = parentScope.$new();
- if (next.controller) {
- $controller(next.controller, {$scope: next.scope});
- }
}
}
$rootScope.$broadcast('$afterRouteChange', next, last);
diff --git a/src/service/scope.js b/src/service/scope.js
index c8ee9298..a2de67e9 100644
--- a/src/service/scope.js
+++ b/src/service/scope.js
@@ -574,7 +574,7 @@ function $RootScopeProvider(){
*
* The event listener function format is: `function(event)`. The `event` object passed into the
* listener has the following attributes
- *
+ *
* - `targetScope` - {Scope}: the scope on which the event was `$emit`-ed or `$broadcast`-ed.
* - `currentScope` - {Scope}: the current scope which is handling the event.
* - `name` - {string}: Name of the event.
diff --git a/src/widgets.js b/src/widgets.js
index 613ae1b4..bc41d761 100644
--- a/src/widgets.js
+++ b/src/widgets.js
@@ -498,23 +498,23 @@ var ngNonBindableDirective = valueFn({ terminal: true });
*
*
* @example
- <doc:example>
+ <doc:example module="ngView">
<doc:source jsfiddle="false">
<script>
- function MyCtrl($route) {
- $route.when('/overview',
- { controller: OverviewCtrl,
- template: 'partials/guide/dev_guide.overview.html'});
- $route.when('/bootstrap',
- { controller: BootstrapCtrl,
- template: 'partials/guide/dev_guide.bootstrap.auto_bootstrap.html'});
- };
- MyCtrl.$inject = ['$route'];
-
function BootstrapCtrl() {}
function OverviewCtrl() {}
+
+ angular.module('ngView', [])
+ .config(function($routeProvider) {
+ $routeProvider.when('/overview',
+ { controller: OverviewCtrl,
+ template: 'partials/guide/dev_guide.overview.html'});
+ $routeProvider.when('/bootstrap',
+ { controller: BootstrapCtrl,
+ template: 'partials/guide/dev_guide.bootstrap.auto_bootstrap.html'});
+ });
</script>
- <div ng:controller="MyCtrl">
+ <div>
<a href="overview">overview</a> |
<a href="bootstrap">bootstrap</a> |
<a href="undefined">undefined</a>
@@ -538,14 +538,18 @@ var ngNonBindableDirective = valueFn({ terminal: true });
</doc:example>
*/
var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile',
- function($http, $templateCache, $route, $anchorScroll, $compile) {
+ '$controller',
+ function($http, $templateCache, $route, $anchorScroll, $compile,
+ $controller) {
return {
terminal: true,
link: function(scope, element) {
var changeCounter = 0;
- scope.$on('$afterRouteChange', function() {
+ processRoute($route.current);
+ scope.$on('$afterRouteChange', function(event, next) {
changeCounter++;
+ processRoute(next);
});
scope.$watch(function() {return changeCounter;}, function(newChangeCounter) {
@@ -571,6 +575,15 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c
clearContent();
}
});
+
+ function processRoute(route) {
+ if (route) {
+ route.scope = scope.$new();
+ if (route.controller) {
+ $controller(route.controller, {$scope: route.scope});
+ }
+ }
+ }
}
};
}];
diff --git a/test/service/routeSpec.js b/test/service/routeSpec.js
index 6c6828bc..97532f38 100644
--- a/test/service/routeSpec.js
+++ b/test/service/routeSpec.js
@@ -1,6 +1,20 @@
'use strict';
describe('$route', function() {
+
+ beforeEach(module(function() {
+ return function($rootScope, $controller) {
+ $rootScope.$on('$afterRouteChange', function(event, next) {
+ // emulate ng:view scope creation
+ if (next) {
+ next.scope = $rootScope.$new();
+ next.controller && $controller(next.controller, {$scope: next.scope});
+ }
+ });
+ };
+ }));
+
+
it('should route and fire change event', function() {
var log = '',
lastRoute,
diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js
index e762e7c0..3b245d11 100644
--- a/test/widgetsSpec.js
+++ b/test/widgetsSpec.js
@@ -633,6 +633,18 @@ describe('widget', function() {
}));
+ it('should create controller instance on $afterRouteChange event', inject(
+ function($route, $rootScope) {
+ var controllerScope;
+ $route.current = { controller: function($scope) { controllerScope = $scope; } };
+ $rootScope.$broadcast('$afterRouteChange', $route.current);
+
+ expect(controllerScope.$parent.$id).toBe($rootScope.$id);
+ expect(controllerScope.$id).toBe($route.current.scope.$id);
+ }
+ ));
+
+
it('should load content via xhr when route changes', function() {
module(function($routeProvider) {
$routeProvider.when('/foo', {template: 'myUrl1'});