fix(route): $destroy scope after update and reload

When we update route (changing only search param, no route reload) and then reload (change to different
route), it did not $destroy last scope.
This commit is contained in:
Vojta Jina 2011-11-30 20:12:42 -08:00 committed by Igor Minar
parent d1e7a5394a
commit b9001e9147
2 changed files with 38 additions and 0 deletions

View file

@ -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');

View file

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