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

Commit 2f0a50b

Browse files
committed
fix($route): allow preventing a route reload
Fixes #9824 Closes #13894
1 parent 4a80a2e commit 2f0a50b

File tree

2 files changed

+106
-25
lines changed

2 files changed

+106
-25
lines changed

src/ngRoute/route.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,18 @@ function $RouteProvider() {
479479
*/
480480
reload: function() {
481481
forceReload = true;
482+
483+
var fakeLocationEvent = {
484+
defaultPrevented: false,
485+
preventDefault: function fakePreventDefault() {
486+
this.defaultPrevented = true;
487+
forceReload = false;
488+
}
489+
};
490+
482491
$rootScope.$evalAsync(function() {
483-
// Don't support cancellation of a reload for now...
484-
prepareRoute();
485-
commitRoute();
492+
prepareRoute(fakeLocationEvent);
493+
if (!fakeLocationEvent.defaultPrevented) commitRoute();
486494
});
487495
},
488496

test/ngRoute/routeSpec.js

+95-22
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ describe('$route', function() {
303303
event.preventDefault();
304304
});
305305

306-
$rootScope.$on('$beforeRouteChange', function(event) {
306+
$rootScope.$on('$routeChangeSuccess', function(event) {
307307
throw new Error('Should not get here');
308308
});
309309

@@ -1214,34 +1214,107 @@ describe('$route', function() {
12141214
});
12151215

12161216
describe('reload', function() {
1217+
var $location;
1218+
var $log;
1219+
var $rootScope;
1220+
var $route;
1221+
var routeChangeStartSpy;
1222+
var routeChangeSuccessSpy;
1223+
1224+
beforeEach(module(function($routeProvider) {
1225+
$routeProvider.when('/bar/:barId', {
1226+
template: '',
1227+
controller: controller,
1228+
reloadOnSearch: false
1229+
});
12171230

1218-
it('should reload even if reloadOnSearch is false', function() {
1219-
var routeChangeSpy = jasmine.createSpy('route change');
1231+
function controller($log) {
1232+
$log.debug('initialized');
1233+
}
1234+
}));
1235+
beforeEach(inject(function($compile, _$location_, _$log_, _$rootScope_, _$route_) {
1236+
$location = _$location_;
1237+
$log = _$log_;
1238+
$rootScope = _$rootScope_;
1239+
$route = _$route_;
12201240

1221-
module(function($routeProvider) {
1222-
$routeProvider.when('/bar/:barId', {controller: angular.noop, reloadOnSearch: false});
1223-
});
1241+
routeChangeStartSpy = jasmine.createSpy('routeChangeStart');
1242+
routeChangeSuccessSpy = jasmine.createSpy('routeChangeSuccess');
12241243

1225-
inject(function($route, $location, $rootScope, $routeParams) {
1226-
$rootScope.$on('$routeChangeSuccess', routeChangeSpy);
1244+
$rootScope.$on('$routeChangeStart', routeChangeStartSpy);
1245+
$rootScope.$on('$routeChangeSuccess', routeChangeSuccessSpy);
12271246

1228-
$location.path('/bar/123');
1229-
$rootScope.$digest();
1230-
expect($routeParams).toEqual({barId:'123'});
1231-
expect(routeChangeSpy).toHaveBeenCalledOnce();
1232-
routeChangeSpy.reset();
1247+
element = $compile('<div><div ng-view></div></div>')($rootScope);
1248+
}));
12331249

1234-
$location.path('/bar/123').search('a=b');
1235-
$rootScope.$digest();
1236-
expect($routeParams).toEqual({barId:'123', a:'b'});
1237-
expect(routeChangeSpy).not.toHaveBeenCalled();
1250+
it('should reload the current route', function() {
1251+
$location.path('/bar/123');
1252+
$rootScope.$digest();
1253+
expect($location.path()).toBe('/bar/123');
1254+
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
1255+
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
1256+
expect($log.debug.logs).toEqual([['initialized']]);
12381257

1239-
$route.reload();
1240-
$rootScope.$digest();
1241-
expect($routeParams).toEqual({barId:'123', a:'b'});
1242-
expect(routeChangeSpy).toHaveBeenCalledOnce();
1243-
});
1258+
routeChangeStartSpy.reset();
1259+
routeChangeSuccessSpy.reset();
1260+
$log.reset();
1261+
1262+
$route.reload();
1263+
$rootScope.$digest();
1264+
expect($location.path()).toBe('/bar/123');
1265+
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
1266+
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
1267+
expect($log.debug.logs).toEqual([['initialized']]);
1268+
1269+
$log.reset();
1270+
});
1271+
1272+
it('should support preventing a route reload', function() {
1273+
$location.path('/bar/123');
1274+
$rootScope.$digest();
1275+
expect($location.path()).toBe('/bar/123');
1276+
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
1277+
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
1278+
expect($log.debug.logs).toEqual([['initialized']]);
1279+
1280+
routeChangeStartSpy.reset();
1281+
routeChangeSuccessSpy.reset();
1282+
$log.reset();
1283+
1284+
routeChangeStartSpy.andCallFake(function(evt) { evt.preventDefault(); });
1285+
1286+
$route.reload();
1287+
$rootScope.$digest();
1288+
expect($location.path()).toBe('/bar/123');
1289+
expect(routeChangeStartSpy).toHaveBeenCalledOnce();
1290+
expect(routeChangeSuccessSpy).not.toHaveBeenCalled();
1291+
expect($log.debug.logs).toEqual([]);
12441292
});
1293+
1294+
it('should reload even if reloadOnSearch is false', inject(function($routeParams) {
1295+
$location.path('/bar/123');
1296+
$rootScope.$digest();
1297+
expect($routeParams).toEqual({barId: '123'});
1298+
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
1299+
expect($log.debug.logs).toEqual([['initialized']]);
1300+
1301+
routeChangeSuccessSpy.reset();
1302+
$log.reset();
1303+
1304+
$location.search('a=b');
1305+
$rootScope.$digest();
1306+
expect($routeParams).toEqual({barId: '123', a: 'b'});
1307+
expect(routeChangeSuccessSpy).not.toHaveBeenCalled();
1308+
expect($log.debug.logs).toEqual([]);
1309+
1310+
$route.reload();
1311+
$rootScope.$digest();
1312+
expect($routeParams).toEqual({barId: '123', a: 'b'});
1313+
expect(routeChangeSuccessSpy).toHaveBeenCalledOnce();
1314+
expect($log.debug.logs).toEqual([['initialized']]);
1315+
1316+
$log.reset();
1317+
}));
12451318
});
12461319
});
12471320

0 commit comments

Comments
 (0)