Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix($route): allow preventing a route reload
Browse files Browse the repository at this point in the history
Fixes #9824
Closes #13894
  • Loading branch information
gkalpak committed Feb 2, 2016
1 parent 4a80a2e commit 2f0a50b
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 25 deletions.
14 changes: 11 additions & 3 deletions src/ngRoute/route.js
Expand Up @@ -479,10 +479,18 @@ function $RouteProvider() {
*/
reload: function() {
forceReload = true;

var fakeLocationEvent = {
defaultPrevented: false,
preventDefault: function fakePreventDefault() {
this.defaultPrevented = true;
forceReload = false;
}
};

$rootScope.$evalAsync(function() {
// Don't support cancellation of a reload for now...
prepareRoute();
commitRoute();
prepareRoute(fakeLocationEvent);
if (!fakeLocationEvent.defaultPrevented) commitRoute();
});
},

Expand Down
117 changes: 95 additions & 22 deletions test/ngRoute/routeSpec.js
Expand Up @@ -303,7 +303,7 @@ describe('$route', function() {
event.preventDefault();
});

$rootScope.$on('$beforeRouteChange', function(event) {
$rootScope.$on('$routeChangeSuccess', function(event) {
throw new Error('Should not get here');
});

Expand Down Expand Up @@ -1214,34 +1214,107 @@ describe('$route', function() {
});

describe('reload', function() {
var $location;
var $log;
var $rootScope;
var $route;
var routeChangeStartSpy;
var routeChangeSuccessSpy;

beforeEach(module(function($routeProvider) {
$routeProvider.when('/bar/:barId', {
template: '',
controller: controller,
reloadOnSearch: false
});

it('should reload even if reloadOnSearch is false', function() {
var routeChangeSpy = jasmine.createSpy('route change');
function controller($log) {
$log.debug('initialized');
}
}));
beforeEach(inject(function($compile, _$location_, _$log_, _$rootScope_, _$route_) {
$location = _$location_;
$log = _$log_;
$rootScope = _$rootScope_;
$route = _$route_;

module(function($routeProvider) {
$routeProvider.when('/bar/:barId', {controller: angular.noop, reloadOnSearch: false});
});
routeChangeStartSpy = jasmine.createSpy('routeChangeStart');
routeChangeSuccessSpy = jasmine.createSpy('routeChangeSuccess');

inject(function($route, $location, $rootScope, $routeParams) {
$rootScope.$on('$routeChangeSuccess', routeChangeSpy);
$rootScope.$on('$routeChangeStart', routeChangeStartSpy);
$rootScope.$on('$routeChangeSuccess', routeChangeSuccessSpy);

$location.path('/bar/123');
$rootScope.$digest();
expect($routeParams).toEqual({barId:'123'});
expect(routeChangeSpy).toHaveBeenCalledOnce();
routeChangeSpy.reset();
element = $compile('<div><div ng-view></div></div>')($rootScope);
}));

$location.path('/bar/123').search('a=b');
$rootScope.$digest();
expect($routeParams).toEqual({barId:'123', a:'b'});
expect(routeChangeSpy).not.toHaveBeenCalled();
it('should reload the current route', function() {
$location.path('/bar/123');
$rootScope.$digest();
expect($location.path()).toBe('/bar/123');
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
expect($log.debug.logs).toEqual([['initialized']]);

$route.reload();
$rootScope.$digest();
expect($routeParams).toEqual({barId:'123', a:'b'});
expect(routeChangeSpy).toHaveBeenCalledOnce();
});
routeChangeStartSpy.reset();
routeChangeSuccessSpy.reset();
$log.reset();

$route.reload();
$rootScope.$digest();
expect($location.path()).toBe('/bar/123');
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
expect($log.debug.logs).toEqual([['initialized']]);

$log.reset();
});

it('should support preventing a route reload', function() {
$location.path('/bar/123');
$rootScope.$digest();
expect($location.path()).toBe('/bar/123');
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
expect($log.debug.logs).toEqual([['initialized']]);

routeChangeStartSpy.reset();
routeChangeSuccessSpy.reset();
$log.reset();

routeChangeStartSpy.andCallFake(function(evt) { evt.preventDefault(); });

$route.reload();
$rootScope.$digest();
expect($location.path()).toBe('/bar/123');
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
expect(routeChangeSuccessSpy).not.toHaveBeenCalled();
expect($log.debug.logs).toEqual([]);
});

it('should reload even if reloadOnSearch is false', inject(function($routeParams) {
$location.path('/bar/123');
$rootScope.$digest();
expect($routeParams).toEqual({barId: '123'});
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
expect($log.debug.logs).toEqual([['initialized']]);

routeChangeSuccessSpy.reset();
$log.reset();

$location.search('a=b');
$rootScope.$digest();
expect($routeParams).toEqual({barId: '123', a: 'b'});
expect(routeChangeSuccessSpy).not.toHaveBeenCalled();
expect($log.debug.logs).toEqual([]);

$route.reload();
$rootScope.$digest();
expect($routeParams).toEqual({barId: '123', a: 'b'});
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
expect($log.debug.logs).toEqual([['initialized']]);

$log.reset();
}));
});
});

Expand Down

0 comments on commit 2f0a50b

Please sign in to comment.