| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  | describe('Navigation lifecycle', function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   var elt, | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     $compile, | 
					
						
							|  |  |  |     $rootScope, | 
					
						
							|  |  |  |     $router, | 
					
						
							|  |  |  |     $compileProvider; | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   beforeEach(function () { | 
					
						
							|  |  |  |     module('ng'); | 
					
						
							|  |  |  |     module('ngComponentRouter'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     module(function (_$compileProvider_) { | 
					
						
							|  |  |  |       $compileProvider = _$compileProvider_; | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     inject(function (_$compile_, _$rootScope_, _$router_) { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |       $compile = _$compile_; | 
					
						
							|  |  |  |       $rootScope = _$rootScope_; | 
					
						
							|  |  |  |       $router = _$router_; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('oneCmp', { | 
					
						
							|  |  |  |       template: '<div>{{oneCmp.number}}</div>', | 
					
						
							|  |  |  |       controller: function () {this.number = 'one'} | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     registerComponent('twoCmp', { | 
					
						
							|  |  |  |       template: '<div><a ng-link="[\'/Two\']">{{twoCmp.number}}</a></div>', | 
					
						
							|  |  |  |       controller: function () {this.number = 'two'} | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should run the activate hook of controllers', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('activate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: '<p>hello</p>', | 
					
						
							|  |  |  |       $onActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div>outer { <div ng-outlet></div> }</div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(spy).toHaveBeenCalled(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should pass instruction into the activate hook of a controller', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('activate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('userCmp', { | 
					
						
							|  |  |  |       $onActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/user/:name', component: 'userCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/user/brian'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     expect(spy).toHaveBeenCalledWith(instructionFor('userCmp'), undefined); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should pass previous instruction into the activate hook of a controller', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('activate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     var activate = registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: 'hi', | 
					
						
							|  |  |  |       $onActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/user/:name', component: 'oneCmp' }, | 
					
						
							|  |  |  |       { path: '/post/:id', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/user/brian'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/post/123'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     expect(spy).toHaveBeenCalledWith(instructionFor('activateCmp'), | 
					
						
							|  |  |  |                                      instructionFor('oneCmp')); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should inject $scope into the controller constructor', function () { | 
					
						
							|  |  |  |     var injectedScope; | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('userCmp', { | 
					
						
							|  |  |  |       template: '', | 
					
						
							|  |  |  |       controller: function ($scope) { | 
					
						
							|  |  |  |         injectedScope = $scope; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/user', component: 'userCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/user'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(injectedScope).toBeDefined(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should run the deactivate hook of controllers', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('deactivate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('deactivateCmp', { | 
					
						
							|  |  |  |       $onDeactivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'deactivateCmp' }, | 
					
						
							|  |  |  |       { path: '/b', component: 'oneCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/b'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(spy).toHaveBeenCalled(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should pass instructions into the deactivate hook of controllers', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('deactivate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('deactivateCmp', { | 
					
						
							|  |  |  |       $onDeactivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/user/:name', component: 'deactivateCmp' }, | 
					
						
							|  |  |  |       { path: '/post/:id', component: 'oneCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/user/brian'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/post/123'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     expect(spy).toHaveBeenCalledWith(instructionFor('oneCmp'), | 
					
						
							|  |  |  |                                      instructionFor('deactivateCmp')); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should run the deactivate hook before the activate hook', function () { | 
					
						
							|  |  |  |     var log = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       $onActivate: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |         log.push('activate'); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('deactivateCmp', { | 
					
						
							|  |  |  |       $onDeactivate: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |         log.push('deactivate'); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'deactivateCmp' }, | 
					
						
							|  |  |  |       { path: '/b', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('outer { <div ng-outlet></div> }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/b'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(log).toEqual(['deactivate', 'activate']); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |   it('should reuse a component when the canReuse hook returns true', function () { | 
					
						
							|  |  |  |     var log = []; | 
					
						
							|  |  |  |     var cmpInstanceCount = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function ReuseCmp() { | 
					
						
							|  |  |  |       cmpInstanceCount++; | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     registerComponent('reuseCmp', { | 
					
						
							|  |  |  |       template: 'reuse {<ng-outlet></ng-outlet>}', | 
					
						
							|  |  |  |       $routeConfig: [ | 
					
						
							|  |  |  |         {path: '/a', component: 'oneCmp'}, | 
					
						
							|  |  |  |         {path: '/b', component: 'twoCmp'} | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       controller: ReuseCmp, | 
					
						
							|  |  |  |       $canReuse: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |         return true; | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       }, | 
					
						
							|  |  |  |       $onReuse: function (next, prev) { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |         log.push('reuse: ' + prev.urlPath + ' -> ' + next.urlPath); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/on-reuse/:number/...', component: 'reuseCmp' }, | 
					
						
							|  |  |  |       { path: '/two', component: 'twoCmp', as: 'Two'} | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('outer { <div ng-outlet></div> }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/on-reuse/1/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(log).toEqual([]); | 
					
						
							|  |  |  |     expect(cmpInstanceCount).toBe(1); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { reuse {one} }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/on-reuse/2/b'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(log).toEqual(['reuse: on-reuse/1 -> on-reuse/2']); | 
					
						
							|  |  |  |     expect(cmpInstanceCount).toBe(1); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { reuse {two} }'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should not reuse a component when the canReuse hook returns false', function () { | 
					
						
							|  |  |  |     var log = []; | 
					
						
							|  |  |  |     var cmpInstanceCount = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function NeverReuseCmp() { | 
					
						
							|  |  |  |       cmpInstanceCount++; | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     registerComponent('reuseCmp', { | 
					
						
							|  |  |  |       template: 'reuse {<ng-outlet></ng-outlet>}', | 
					
						
							|  |  |  |       $routeConfig: [ | 
					
						
							|  |  |  |         {path: '/a', component: 'oneCmp'}, | 
					
						
							|  |  |  |         {path: '/b', component: 'twoCmp'} | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       controller: NeverReuseCmp, | 
					
						
							|  |  |  |       $canReuse: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |         return false; | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       }, | 
					
						
							|  |  |  |       $onReuse: function (next, prev) { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |         log.push('reuse: ' + prev.urlPath + ' -> ' + next.urlPath); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/never-reuse/:number/...', component: 'reuseCmp' }, | 
					
						
							|  |  |  |       { path: '/two', component: 'twoCmp', as: 'Two'} | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('outer { <div ng-outlet></div> }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/never-reuse/1/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(log).toEqual([]); | 
					
						
							|  |  |  |     expect(cmpInstanceCount).toBe(1); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { reuse {one} }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/never-reuse/2/b'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:58 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(log).toEqual([]); | 
					
						
							|  |  |  |     expect(cmpInstanceCount).toBe(2); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { reuse {two} }'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |   // TODO: need to solve getting ahold of canActivate hook
 | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   it('should not activate a component when canActivate returns false', function () { | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     var canActivateSpy = jasmine.createSpy('canActivate').and.returnValue(false); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     var spy = jasmine.createSpy('activate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       $canActivate: canActivateSpy, | 
					
						
							|  |  |  |       $onActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('outer { <div ng-outlet></div> }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(spy).not.toHaveBeenCalled(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer {  }'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should activate a component when canActivate returns true', function () { | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     var activateSpy = jasmine.createSpy('activate'); | 
					
						
							|  |  |  |     var canActivateSpy = jasmine.createSpy('canActivate').and.returnValue(true); | 
					
						
							|  |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: 'hi', | 
					
						
							|  |  |  |       $canActivate: canActivateSpy, | 
					
						
							|  |  |  |       $onActivate: activateSpy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     expect(canActivateSpy).toHaveBeenCalled(); | 
					
						
							|  |  |  |     expect(activateSpy).toHaveBeenCalled(); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     expect(elt.text()).toBe('hi'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should activate a component when canActivate returns a resolved promise', inject(function ($q) { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('activate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: 'hi', | 
					
						
							|  |  |  |       $canActivate: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |         return $q.when(true); | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       $onActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(spy).toHaveBeenCalled(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('hi'); | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should inject into the canActivate hook of controllers', inject(function ($http) { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('canActivate').and.returnValue(true); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       $canActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     spy.$inject = ['$nextInstruction', '$http']; | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/user/:name', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/user/brian'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     expect(spy).toHaveBeenCalled(); | 
					
						
							|  |  |  |     var args = spy.calls.mostRecent().args; | 
					
						
							|  |  |  |     expect(args[0].params).toEqual({name: 'brian'}); | 
					
						
							|  |  |  |     expect(args[1]).toBe($http); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should not navigate when canDeactivate returns false', function () { | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: 'hi', | 
					
						
							|  |  |  |       $canDeactivate: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |         return false; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' }, | 
					
						
							|  |  |  |       { path: '/b', component: 'oneCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('outer { <div ng-outlet></div> }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { hi }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/b'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { hi }'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should navigate when canDeactivate returns true', function () { | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: 'hi', | 
					
						
							|  |  |  |       $canDeactivate: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |         return true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' }, | 
					
						
							|  |  |  |       { path: '/b', component: 'oneCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('outer { <div ng-outlet></div> }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { hi }'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/b'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('outer { one }'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should activate a component when canActivate returns true', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('activate'); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('activateCmp', { | 
					
						
							|  |  |  |       template: 'hi', | 
					
						
							|  |  |  |       $canActivate: function () { | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |         return true; | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       $onActivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/a', component: 'activateCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/a'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(spy).toHaveBeenCalled(); | 
					
						
							|  |  |  |     expect(elt.text()).toBe('hi'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should pass instructions into the canDeactivate hook of controllers', function () { | 
					
						
							|  |  |  |     var spy = jasmine.createSpy('canDeactivate').and.returnValue(true); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     registerComponent('deactivateCmp', { | 
					
						
							|  |  |  |       $canDeactivate: spy | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $router.config([ | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |       { path: '/user/:name', component: 'deactivateCmp' }, | 
					
						
							|  |  |  |       { path: '/post/:id', component: 'oneCmp' } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     ]); | 
					
						
							|  |  |  |     compile('<div ng-outlet></div>'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/user/brian'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |     $router.navigateByUrl('/post/123'); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     $rootScope.$digest(); | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     expect(spy).toHaveBeenCalledWith(instructionFor('oneCmp'), | 
					
						
							|  |  |  |                                      instructionFor('deactivateCmp')); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   function registerComponent(name, options) { | 
					
						
							|  |  |  |     var controller = options.controller || function () {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ['$onActivate', '$onDeactivate', '$onReuse', '$canReuse', '$canDeactivate'].forEach(function (hookName) { | 
					
						
							|  |  |  |       if (options[hookName]) { | 
					
						
							|  |  |  |         controller.prototype[hookName] = options[hookName]; | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function factory() { | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         template: options.template || '', | 
					
						
							|  |  |  |         controllerAs: name, | 
					
						
							|  |  |  |         controller: controller | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     if (options.$canActivate) { | 
					
						
							|  |  |  |       factory.$canActivate = options.$canActivate; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (options.$routeConfig) { | 
					
						
							|  |  |  |       factory.$routeConfig = options.$routeConfig; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  |     $compileProvider.directive(name, factory); | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function compile(template) { | 
					
						
							|  |  |  |     elt = $compile('<div>' + template + '</div>')($rootScope); | 
					
						
							|  |  |  |     $rootScope.$digest(); | 
					
						
							|  |  |  |     return elt; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
											  
											
												refactor(angular_1_router): use directives for route targets
BREAKING CHANGE:
Previously, route configuration took a controller constructor function as the value of
`component` in a route definition:
```
$route.config([
  { route: '/', component: MyController }
])
```
Based on the name of the controller, we used to use a componentMapper service to
determine what template to pair with each controller, how to bind the instance to
the $scope.
To make the 1.x router more semantically alligned with Angular 2, we now route to a directive.
Thus a route configuration takes a normalized directive name:
```
$route.config([
  { route: '/', component: 'myDirective' }
])
```
BREAKING CHANGE:
In order to avoid name collisions, lifecycle hooks are now prefixed with `$`. Before:
```
MyController.prototype.onActivate = ...
```
After:
```
MyController.prototype.$onActivate = ...
```
Same for `$canActivate` (which now lives on the directive factory function),
`$canDeactivate`, `$canReuse`, and `$onDeactivate` hooks.
											
										 
											2015-09-18 15:53:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   function instructionFor(componentType) { | 
					
						
							|  |  |  |     return jasmine.objectContaining({componentType: componentType}); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-08-20 13:19:34 -07:00
										 |  |  | }); |