| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   beforeEachProviders, | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   xdescribe, | 
					
						
							|  |  |  |   xit, | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | } from '@angular/core/testing/testing_internal'; | 
					
						
							|  |  |  | import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; | 
					
						
							|  |  |  | import {TestComponentBuilder} from '@angular/compiler/testing'; | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {bootstrap} from '@angular/platform-browser-dynamic'; | 
					
						
							|  |  |  | import {APP_BASE_HREF, LocationStrategy} from '@angular/common'; | 
					
						
							|  |  |  | import {Component, Directive} from '@angular/core/src/metadata'; | 
					
						
							|  |  |  | import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; | 
					
						
							|  |  |  | import {Console} from '@angular/core/src/console'; | 
					
						
							|  |  |  | import {provide} from '@angular/core'; | 
					
						
							|  |  |  | import {DOCUMENT} from '@angular/platform-browser/src/dom/dom_tokens'; | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   RouteConfig, | 
					
						
							|  |  |  |   Route, | 
					
						
							|  |  |  |   Redirect, | 
					
						
							|  |  |  |   AuxRoute | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | } from '../../../router/src/route_config/route_config_decorator'; | 
					
						
							|  |  |  | import {PromiseWrapper} from '../../src/facade/async'; | 
					
						
							|  |  |  | import {BaseException, WrappedException} from '../../src/facade/exceptions'; | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   ROUTER_PROVIDERS, | 
					
						
							|  |  |  |   ROUTER_PRIMARY_COMPONENT, | 
					
						
							|  |  |  |   RouteParams, | 
					
						
							|  |  |  |   Router, | 
					
						
							| 
									
										
										
											
												refactor(Location): out of router and into platform/common
closes https://github.com/angular/angular/issues/4943
BREAKING CHANGE:
`Location` and other related providers have been moved out of `router` and into `platform/common`. `BrowserPlatformLocation` is not meant to be used directly however advanced configurations may use it via the following import change.
Before:
```
import {
  PlatformLocation,
  Location,
  LocationStrategy,
  HashLocationStrategy,
  PathLocationStrategy,
  APP_BASE_HREF}
from 'angular2/router';
import {BrowserPlatformLocation} from 'angular2/src/router/location/browser_platform_location';
```
After:
```
import {
  PlatformLocation,
  Location,
  LocationStrategy,
  HashLocationStrategy,
  PathLocationStrategy,
  APP_BASE_HREF}
from 'angular2/platform/common';
import {BrowserPlatformLocation} from 'angular2/src/platform/browser/location/browser_platform_location';
```
Closes #7962
											
										 
											2016-04-08 00:31:20 -07:00
										 |  |  |   ROUTER_DIRECTIVES | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | } from '@angular/router'; | 
					
						
							| 
									
										
										
										
											2015-07-21 01:26:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {MockLocationStrategy} from '@angular/common/testing'; | 
					
						
							|  |  |  | import {ApplicationRef} from '@angular/core/src/application_ref'; | 
					
						
							|  |  |  | import {MockApplicationRef} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | //noinspection JSAnnotator
 | 
					
						
							| 
									
										
										
										
											2015-12-15 08:34:44 -08:00
										 |  |  | class DummyConsole implements Console { | 
					
						
							|  |  |  |   log(message) {} | 
					
						
							| 
									
										
										
										
											2016-04-25 19:52:24 -07:00
										 |  |  |   warn(message) {} | 
					
						
							| 
									
										
										
										
											2015-12-15 08:34:44 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | export function main() { | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  |   describe('router bootstrap', () => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |     beforeEachProviders(() => [ | 
					
						
							|  |  |  |       ROUTER_PROVIDERS, | 
					
						
							|  |  |  |       provide(LocationStrategy, {useClass: MockLocationStrategy}), | 
					
						
							|  |  |  |       provide(ApplicationRef, {useClass: MockApplicationRef}) | 
					
						
							|  |  |  |     ]); | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |     // do not refactor out the `bootstrap` functionality. We still want to
 | 
					
						
							| 
									
										
										
										
											2016-04-14 14:52:35 -07:00
										 |  |  |     // keep this test around so we can ensure that bootstrap a router works
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  |     it('should bootstrap a simple app', inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |          var fakeDoc = getDOM().createHtmlDocument(); | 
					
						
							|  |  |  |          var el = getDOM().createElement('app-cmp', fakeDoc); | 
					
						
							|  |  |  |          getDOM().appendChild(fakeDoc.body, el); | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |          bootstrap(AppCmp, | 
					
						
							|  |  |  |                    [ | 
					
						
							|  |  |  |                      ROUTER_PROVIDERS, | 
					
						
							|  |  |  |                      provide(ROUTER_PRIMARY_COMPONENT, {useValue: AppCmp}), | 
					
						
							|  |  |  |                      provide(LocationStrategy, {useClass: MockLocationStrategy}), | 
					
						
							|  |  |  |                      provide(DOCUMENT, {useValue: fakeDoc}), | 
					
						
							|  |  |  |                      provide(Console, {useClass: DummyConsole}) | 
					
						
							|  |  |  |                    ]) | 
					
						
							|  |  |  |              .then((applicationRef) => { | 
					
						
							| 
									
										
										
										
											2016-04-13 17:05:17 -07:00
										 |  |  |                var router = applicationRef.instance.router; | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                router.subscribe((_) => { | 
					
						
							|  |  |  |                  expect(el).toHaveText('outer { hello }'); | 
					
						
							| 
									
										
										
										
											2016-04-13 17:05:17 -07:00
										 |  |  |                  expect(applicationRef.instance.location.path()).toEqual(''); | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |              }); | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  |        })); | 
					
						
							| 
									
										
										
										
											2015-06-08 18:04:13 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |     describe('broken app', () => { | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  |       beforeEachProviders(() => [provide(ROUTER_PRIMARY_COMPONENT, {useValue: BrokenAppCmp})]); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should rethrow exceptions from component constructors', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter, TestComponentBuilder], (async, tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2015-10-31 09:50:19 -07:00
										 |  |  |            tcb.createAsync(AppCmp).then((fixture) => { | 
					
						
							|  |  |  |              var router = fixture.debugElement.componentInstance.router; | 
					
						
							| 
									
										
										
										
											2015-09-08 21:41:56 -07:00
										 |  |  |              PromiseWrapper.catchError(router.navigateByUrl('/cause-error'), (error) => { | 
					
						
							| 
									
										
										
										
											2015-07-23 18:00:19 -07:00
										 |  |  |                expect(error).toContainError('oops!'); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |                async.done(); | 
					
						
							| 
									
										
										
										
											2015-06-15 15:41:09 -07:00
										 |  |  |              }); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-09-09 16:41:11 +02:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-06-15 15:41:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  |     describe('back button app', () => { | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  |       beforeEachProviders(() => [provide(ROUTER_PRIMARY_COMPONENT, {useValue: HierarchyAppCmp})]); | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should change the url without pushing a new history state for back navigations', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter, TestComponentBuilder], (async, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            tcb.createAsync(HierarchyAppCmp) | 
					
						
							|  |  |  |                .then((fixture) => { | 
					
						
							|  |  |  |                  var router = fixture.debugElement.componentInstance.router; | 
					
						
							|  |  |  |                  var position = 0; | 
					
						
							|  |  |  |                  var flipped = false; | 
					
						
							|  |  |  |                  var history = [ | 
					
						
							|  |  |  |                    ['/parent/child', 'root { parent { hello } }', '/super-parent/child'], | 
					
						
							|  |  |  |                    ['/super-parent/child', 'root { super-parent { hello2 } }', '/parent/child'], | 
					
						
							|  |  |  |                    ['/parent/child', 'root { parent { hello } }', false] | 
					
						
							|  |  |  |                  ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  router.subscribe((_) => { | 
					
						
							|  |  |  |                    var location = fixture.debugElement.componentInstance.location; | 
					
						
							|  |  |  |                    var element = fixture.debugElement.nativeElement; | 
					
						
							|  |  |  |                    var path = location.path(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    var entry = history[position]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    expect(path).toEqual(entry[0]); | 
					
						
							|  |  |  |                    expect(element).toHaveText(entry[1]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    var nextUrl = entry[2]; | 
					
						
							|  |  |  |                    if (nextUrl == false) { | 
					
						
							|  |  |  |                      flipped = true; | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    if (flipped && position == 0) { | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                      return; | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    position = position + (flipped ? -1 : 1); | 
					
						
							|  |  |  |                    if (flipped) { | 
					
						
							|  |  |  |                      location.back(); | 
					
						
							|  |  |  |                    } else { | 
					
						
							|  |  |  |                      router.navigateByUrl(nextUrl); | 
					
						
							|  |  |  |                    } | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                  router.navigateByUrl(history[0][0]); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-08-12 17:53:08 -07:00
										 |  |  |          }), 1000); | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |     describe('hierarchical app', () => { | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |       beforeEachProviders( | 
					
						
							| 
									
										
										
										
											2015-10-12 11:30:34 -07:00
										 |  |  |           () => { return [provide(ROUTER_PRIMARY_COMPONENT, {useValue: HierarchyAppCmp})]; }); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should bootstrap an app with a hierarchy', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter, TestComponentBuilder], (async, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            tcb.createAsync(HierarchyAppCmp) | 
					
						
							|  |  |  |                .then((fixture) => { | 
					
						
							|  |  |  |                  var router = fixture.debugElement.componentInstance.router; | 
					
						
							|  |  |  |                  router.subscribe((_) => { | 
					
						
							|  |  |  |                    expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                        .toHaveText('root { parent { hello } }'); | 
					
						
							|  |  |  |                    expect(fixture.debugElement.componentInstance.location.path()) | 
					
						
							|  |  |  |                        .toEqual('/parent/child'); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |                  router.navigateByUrl('/parent/child'); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-09-09 16:41:11 +02:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 13:57:41 +00:00
										 |  |  |       // TODO(btford): mock out level lower than LocationStrategy once that level exists
 | 
					
						
							|  |  |  |       xdescribe('custom app base ref', () => { | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |         beforeEachProviders(() => { return [provide(APP_BASE_HREF, {useValue: '/my/app'})]; }); | 
					
						
							| 
									
										
										
										
											2015-08-26 16:45:03 +02:00
										 |  |  |         it('should bootstrap', | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            inject([AsyncTestCompleter, TestComponentBuilder], | 
					
						
							|  |  |  |                   (async, tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     tcb.createAsync(HierarchyAppCmp) | 
					
						
							|  |  |  |                         .then((fixture) => { | 
					
						
							|  |  |  |                           var router = fixture.debugElement.componentInstance.router; | 
					
						
							|  |  |  |                           router.subscribe((_) => { | 
					
						
							|  |  |  |                             expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                                 .toHaveText('root { parent { hello } }'); | 
					
						
							|  |  |  |                             expect(fixture.debugElement.componentInstance.location.path()) | 
					
						
							|  |  |  |                                 .toEqual('/my/app/parent/child'); | 
					
						
							|  |  |  |                             async.done(); | 
					
						
							|  |  |  |                           }); | 
					
						
							|  |  |  |                           router.navigateByUrl('/parent/child'); | 
					
						
							|  |  |  |                         }); | 
					
						
							|  |  |  |                   })); | 
					
						
							| 
									
										
										
										
											2015-07-21 15:05:08 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 01:26:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('querystring params app', () => { | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |       beforeEachProviders( | 
					
						
							| 
									
										
										
										
											2015-10-12 11:30:34 -07:00
										 |  |  |           () => { return [provide(ROUTER_PRIMARY_COMPONENT, {useValue: QueryStringAppCmp})]; }); | 
					
						
							| 
									
										
										
										
											2015-07-21 01:26:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should recognize and return querystring params with the injected RouteParams', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter, TestComponentBuilder], (async, tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |            tcb.createAsync(QueryStringAppCmp) | 
					
						
							|  |  |  |                .then((fixture) => { | 
					
						
							|  |  |  |                  var router = fixture.debugElement.componentInstance.router; | 
					
						
							|  |  |  |                  router.subscribe((_) => { | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    expect(fixture.debugElement.nativeElement) | 
					
						
							|  |  |  |                        .toHaveText('qParam = search-for-something'); | 
					
						
							|  |  |  |                    /* | 
					
						
							|  |  |  |                    expect(applicationRef.hostComponent.location.path()) | 
					
						
							|  |  |  |                        .toEqual('/qs?q=search-for-something');*/ | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |                  router.navigateByUrl('/qs?q=search-for-something'); | 
					
						
							|  |  |  |                  fixture.detectChanges(); | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-09-09 16:41:11 +02:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2015-07-21 01:26:43 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     describe('activate event on outlet', () => { | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |       let tcb: TestComponentBuilder = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEachProviders(() => [provide(ROUTER_PRIMARY_COMPONENT, {useValue: AppCmp})]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       beforeEach(inject([TestComponentBuilder], | 
					
						
							|  |  |  |                         (testComponentBuilder) => { tcb = testComponentBuilder; })); | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should get a reference and pass data to components loaded inside of outlets', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async) => { | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |            tcb.createAsync(AppWithOutletListeners) | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                .then(fixture => { | 
					
						
							|  |  |  |                  let appInstance = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                  let router = appInstance.router; | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                  router.subscribe((_) => { | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                    expect(appInstance.helloCmp).toBeAnInstanceOf(HelloCmp); | 
					
						
							|  |  |  |                    expect(appInstance.helloCmp.message).toBe('Ahoy'); | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                  // TODO(juliemr): This isn't necessary for the test to pass - figure
 | 
					
						
							|  |  |  |                  // out what's going on.
 | 
					
						
							|  |  |  |                  // router.navigateByUrl('/rainbow(pony)');
 | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({selector: 'hello-cmp', template: 'hello'}) | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | class HelloCmp { | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |   public message: string; | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({selector: 'hello2-cmp', template: 'hello2'}) | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  | class Hello2Cmp { | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |   public greeting: string; | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'app-cmp', | 
					
						
							|  |  |  |   template: `outer { <router-outlet></router-outlet> }`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-07-13 16:12:48 -07:00
										 |  |  | @RouteConfig([new Route({path: '/', component: HelloCmp})]) | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | class AppCmp { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:14:19 -07:00
										 |  |  |   constructor(public router: Router, public location: LocationStrategy) {} | 
					
						
							| 
									
										
										
										
											2015-06-15 15:41:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'app-cmp', | 
					
						
							|  |  |  |   template: `
 | 
					
						
							|  |  |  |     Hello routing! | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     <router-outlet (activate)="activateHello($event)"></router-outlet> | 
					
						
							|  |  |  |     <router-outlet (activate)="activateHello2($event)" name="pony"></router-outlet>`, | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | @RouteConfig([ | 
					
						
							|  |  |  |   new Route({path: '/rainbow', component: HelloCmp}), | 
					
						
							|  |  |  |   new AuxRoute({name: 'pony', path: 'pony', component: Hello2Cmp}) | 
					
						
							|  |  |  | ]) | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  | class AppWithOutletListeners { | 
					
						
							|  |  |  |   helloCmp: HelloCmp; | 
					
						
							|  |  |  |   hello2Cmp: Hello2Cmp; | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   constructor(public router: Router, public location: LocationStrategy) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |   activateHello(cmp: HelloCmp) { | 
					
						
							|  |  |  |     this.helloCmp = cmp; | 
					
						
							|  |  |  |     this.helloCmp.message = 'Ahoy'; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   activateHello2(cmp: Hello2Cmp) { this.hello2Cmp = cmp; } | 
					
						
							| 
									
										
										
										
											2015-11-06 10:01:03 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'parent-cmp', | 
					
						
							|  |  |  |   template: `parent { <router-outlet></router-outlet> }`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-07-13 16:12:48 -07:00
										 |  |  | @RouteConfig([new Route({path: '/child', component: HelloCmp})]) | 
					
						
							| 
									
										
										
										
											2015-06-15 15:41:09 -07:00
										 |  |  | class ParentCmp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'super-parent-cmp', | 
					
						
							|  |  |  |   template: `super-parent { <router-outlet></router-outlet> }`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  | @RouteConfig([new Route({path: '/child', component: Hello2Cmp})]) | 
					
						
							|  |  |  | class SuperParentCmp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'app-cmp', | 
					
						
							|  |  |  |   template: `root { <router-outlet></router-outlet> }`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-07-28 01:46:09 -04:00
										 |  |  | @RouteConfig([ | 
					
						
							|  |  |  |   new Route({path: '/parent/...', component: ParentCmp}), | 
					
						
							|  |  |  |   new Route({path: '/super-parent/...', component: SuperParentCmp}) | 
					
						
							|  |  |  | ]) | 
					
						
							| 
									
										
										
										
											2015-06-15 15:41:09 -07:00
										 |  |  | class HierarchyAppCmp { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:14:19 -07:00
										 |  |  |   constructor(public router: Router, public location: LocationStrategy) {} | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-08 18:04:13 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({selector: 'qs-cmp', template: `qParam = {{q}}`}) | 
					
						
							| 
									
										
										
										
											2015-07-21 01:26:43 -07:00
										 |  |  | class QSCmp { | 
					
						
							|  |  |  |   q: string; | 
					
						
							|  |  |  |   constructor(params: RouteParams) { this.q = params.get('q'); } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'app-cmp', | 
					
						
							|  |  |  |   template: `<router-outlet></router-outlet>`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-07-21 01:26:43 -07:00
										 |  |  | @RouteConfig([new Route({path: '/qs', component: QSCmp})]) | 
					
						
							|  |  |  | class QueryStringAppCmp { | 
					
						
							|  |  |  |   constructor(public router: Router, public location: LocationStrategy) {} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | @Component({selector: 'oops-cmp', template: "oh no"}) | 
					
						
							| 
									
										
										
										
											2015-06-08 18:04:13 -07:00
										 |  |  | class BrokenCmp { | 
					
						
							|  |  |  |   constructor() { throw new BaseException('oops!'); } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'app-cmp', | 
					
						
							|  |  |  |   template: `outer { <router-outlet></router-outlet> }`, | 
					
						
							|  |  |  |   directives: ROUTER_DIRECTIVES | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-07-13 16:12:48 -07:00
										 |  |  | @RouteConfig([new Route({path: '/cause-error', component: BrokenCmp})]) | 
					
						
							| 
									
										
										
										
											2015-06-08 18:04:13 -07:00
										 |  |  | class BrokenAppCmp { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:14:19 -07:00
										 |  |  |   constructor(public router: Router, public location: LocationStrategy) {} | 
					
						
							| 
									
										
										
										
											2015-06-08 18:04:13 -07:00
										 |  |  | } |