diff options
| author | Vojta Jina | 2011-11-30 20:12:42 -0800 | 
|---|---|---|
| committer | Igor Minar | 2011-12-06 13:35:05 -0800 | 
| commit | b9001e914740ea0e3bba357a33ddaf13610c874f (patch) | |
| tree | b668d5f2852a5b758e9f8c2f8428965e9ecba4b8 | |
| parent | d1e7a5394ad74e0dc024a50f77fa32b46eac1be2 (diff) | |
| download | angular.js-b9001e914740ea0e3bba357a33ddaf13610c874f.tar.bz2 | |
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.
| -rw-r--r-- | src/service/route.js | 1 | ||||
| -rw-r--r-- | test/service/routeSpec.js | 37 | 
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', | 
