aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/service/route.js1
-rw-r--r--test/service/routeSpec.js37
2 files changed, 38 insertions, 0 deletions
diff --git a/src/service/route.js b/src/service/route.js
index 97c9cee0..77d94e9c 100644
--- a/src/service/route.js
+++ b/src/service/route.js
@@ -258,6 +258,7 @@ function $RouteProvider(){
if (next && last && next.$route === last.$route
&& equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) {
+ next.scope = last.scope;
$route.current = next;
copy(next.params, $routeParams);
last.scope && last.scope.$emit('$routeUpdate');
diff --git a/test/service/routeSpec.js b/test/service/routeSpec.js
index fed3faef..95560d29 100644
--- a/test/service/routeSpec.js
+++ b/test/service/routeSpec.js
@@ -401,6 +401,43 @@ describe('$route', function() {
}));
+ it('should $destroy scope after update and reload',
+ inject(function($route, $location, $rootScope) {
+ // this is a regression of bug, where $route doesn't copy scope when only updating
+
+ var log = [];
+
+ function logger(msg) {
+ return function() {
+ log.push(msg);
+ };
+ }
+
+ function createController(name) {
+ return function() {
+ log.push('init-' + name);
+ this.$on('$destroy', logger('destroy-' + name));
+ this.$on('$routeUpdate', logger('route-update'));
+ };
+ }
+
+ $route.when('/foo', {controller: createController('foo'), reloadOnSearch: false});
+ $route.when('/bar', {controller: createController('bar')});
+
+ $location.url('/foo');
+ $rootScope.$digest();
+ expect(log).toEqual(['init-foo']);
+
+ $location.search({q: 'some'});
+ $rootScope.$digest();
+ expect(log).toEqual(['init-foo', 'route-update']);
+
+ $location.url('/bar');
+ $rootScope.$digest();
+ expect(log).toEqual(['init-foo', 'route-update', 'destroy-foo', 'init-bar']);
+ }));
+
+
describe('reload', function() {
it('should reload even if reloadOnSearch is false',