`,
- styles: ['input {width: 20em}'],
- animations: [ slideInDownAnimation ]
+ styles: ['input {width: 20em}']
})
export class CrisisDetailComponent implements OnInit {
- @HostBinding('@routeAnimation') routeAnimation = true;
- @HostBinding('style.display') display = 'block';
- @HostBinding('style.position') position = 'absolute';
-
crisis: Crisis;
editName: string;
diff --git a/aio/content/examples/router/src/app/crisis-center/crisis-detail.component.ts b/aio/content/examples/router/src/app/crisis-center/crisis-detail.component.ts
index 2b5150686c..c3510a8df9 100644
--- a/aio/content/examples/router/src/app/crisis-center/crisis-detail.component.ts
+++ b/aio/content/examples/router/src/app/crisis-center/crisis-detail.component.ts
@@ -4,7 +4,6 @@ import { Component, OnInit, HostBinding } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Observable } from 'rxjs';
-import { slideInDownAnimation } from '../animations';
import { Crisis } from './crisis.service';
import { DialogService } from '../dialog.service';
@@ -24,14 +23,9 @@ import { DialogService } from '../dialog.service';
`,
- styles: ['input {width: 20em}'],
- animations: [ slideInDownAnimation ]
+ styles: ['input {width: 20em}']
})
export class CrisisDetailComponent implements OnInit {
- @HostBinding('@routeAnimation') routeAnimation = true;
- @HostBinding('style.display') display = 'block';
- @HostBinding('style.position') position = 'absolute';
-
crisis: Crisis;
editName: string;
diff --git a/aio/content/examples/router/src/app/heroes/hero-detail.component.ts b/aio/content/examples/router/src/app/heroes/hero-detail.component.ts
index 2170686864..2ef9347dcf 100644
--- a/aio/content/examples/router/src/app/heroes/hero-detail.component.ts
+++ b/aio/content/examples/router/src/app/heroes/hero-detail.component.ts
@@ -7,8 +7,6 @@ import { Component, OnInit, HostBinding } from '@angular/core';
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { Observable } from 'rxjs';
-import { slideInDownAnimation } from '../animations';
-
import { Hero, HeroService } from './hero.service';
@Component({
@@ -26,16 +24,9 @@ import { Hero, HeroService } from './hero.service';
- `,
- animations: [ slideInDownAnimation ]
+ `
})
export class HeroDetailComponent implements OnInit {
-// #docregion host-bindings
- @HostBinding('@routeAnimation') routeAnimation = true;
- @HostBinding('style.display') display = 'block';
- @HostBinding('style.position') position = 'absolute';
-// #enddocregion host-bindings
-
hero$: Observable;
// #docregion ctor
diff --git a/aio/content/examples/router/src/app/heroes/heroes-routing.module.2.ts b/aio/content/examples/router/src/app/heroes/heroes-routing.module.2.ts
new file mode 100644
index 0000000000..6f8d5fda4b
--- /dev/null
+++ b/aio/content/examples/router/src/app/heroes/heroes-routing.module.2.ts
@@ -0,0 +1,22 @@
+// #docregion
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { HeroListComponent } from './hero-list.component';
+import { HeroDetailComponent } from './hero-detail.component';
+
+const heroesRoutes: Routes = [
+ { path: 'heroes', component: HeroListComponent, data: { animation: 'heroes' } },
+ { path: 'hero/:id', component: HeroDetailComponent, data: { animation: 'hero' } }
+];
+
+@NgModule({
+ imports: [
+ RouterModule.forChild(heroesRoutes)
+ ],
+ exports: [
+ RouterModule
+ ]
+})
+export class HeroRoutingModule { }
+// #enddocregion
diff --git a/aio/content/examples/router/src/app/heroes/heroes-routing.module.ts b/aio/content/examples/router/src/app/heroes/heroes-routing.module.ts
index 43558907b0..11aab5f48c 100644
--- a/aio/content/examples/router/src/app/heroes/heroes-routing.module.ts
+++ b/aio/content/examples/router/src/app/heroes/heroes-routing.module.ts
@@ -8,8 +8,8 @@ import { HeroDetailComponent } from './hero-detail.component';
const heroesRoutes: Routes = [
{ path: 'heroes', redirectTo: '/superheroes' },
{ path: 'hero/:id', redirectTo: '/superhero/:id' },
- { path: 'superheroes', component: HeroListComponent },
- { path: 'superhero/:id', component: HeroDetailComponent }
+ { path: 'superheroes', component: HeroListComponent, data: { animation: 'heroes' } },
+ { path: 'superhero/:id', component: HeroDetailComponent, data: { animation: 'hero' } }
];
@NgModule({
diff --git a/aio/content/guide/router.md b/aio/content/guide/router.md
index 0ecd1c8151..3802e1eb9f 100644
--- a/aio/content/guide/router.md
+++ b/aio/content/guide/router.md
@@ -2171,8 +2171,7 @@ The optional `foo` route parameter is harmless and continues to be ignored.
### Adding animations to the routed component
The heroes feature module is almost complete, but what is a feature without some smooth transitions?
-This section shows you how to add some [animations](guide/animations)
-to the `HeroDetailComponent`.
+This section shows you how to add some [animations](guide/animations) to the `HeroDetailComponent`.
First import `BrowserAnimationsModule`:
@@ -2180,6 +2179,11 @@ First import `BrowserAnimationsModule`:
+Next, add a `data` object to the routes for `HeroListComponent` and `HeroDetailComponent`. Transitions are based on `states` and you'll use the `animation` data from the route to provide a named animation `state` for the transitions.
+
+
+
+
Create an `animations.ts` file in the root `src/app/` folder. The contents look like this:
@@ -2189,53 +2193,40 @@ Create an `animations.ts` file in the root `src/app/` folder. The contents look
-
This file does the following:
* Imports the animation symbols that build the animation triggers, control state, and manage transitions between states.
-* Exports a constant named `slideInDownAnimation` set to an animation trigger named *`routeAnimation`*;
-animated components will refer to this name.
+* Exports a constant named `slideInAnimation` set to an animation trigger named *`routeAnimation`*;
-* Specifies the _wildcard state_ , `*`, that matches any animation state that the route component is in.
+* Defines one *transition* when switching back and forth from the `heroes` and `hero` routes to ease the component in from the left of the screen as it enters the application view (`:enter`), the other to animate the component to the right as it leaves the application view (`:leave`).
-* Defines two *transitions*, one to ease the component in from the left of the screen as it enters the application view (`:enter`),
-the other to animate the component down as it leaves the application view (`:leave`).
+You could also create more transitions for other routes. This trigger is sufficient for the current milestone.
-You could create more triggers with different transitions for other route components. This trigger is sufficient for the current milestone.
+Back in the `AppComponent`, import the `RouterOutlet` token from the `@angular/router` package and the `slideInDownAnimation` from `'./animations.ts`.
-
-Back in the `HeroDetailComponent`, import the `slideInDownAnimation` from `'./animations.ts`.
-Add the `HostBinding` decorator to the imports from `@angular/core`; you'll need it in a moment.
-
-Add an `animations` array to the `@Component` metadata's that contains the `slideInDownAnimation`.
-
-Then add three `@HostBinding` properties to the class to set the animation and styles for the route component's element.
-
-
+
+In order to use the routable animations, you'll need to wrap the `RouterOutlet` inside an element. You'll
+use the `@routeAnimation` trigger and bind it to the element.
+For the `@routeAnimation` transitions to key off states, you'll need to provide it with the `data` from the `ActivatedRoute`. The `RouterOutlet` is exposed as an `outlet` template variable, so you bind a reference to the router outlet. A variable of `routerOutlet` is an ideal choice.
-The `'@routeAnimation'` passed to the first `@HostBinding` matches
-the name of the `slideInDownAnimation` _trigger_, `routeAnimation`.
-Set the `routeAnimation` property to `true` because you only care about the `:enter` and `:leave` states.
+Add an `animations` array to the `@Component` metadata's that contains the `slideInDownAnimation`.
-The other two `@HostBinding` properties style the display and position of the component.
+
-The `HeroDetailComponent` will ease in from the left when routed to and will slide down when navigating away.
+
+The `@routeAnimation` property is bound to the `getAnimationData` with the provided `routerOutlet` reference, so you'll need to define that function in the `AppComponent`. The `getAnimationData` function returns the animation property from the `data` provided through the `ActivatedRoute`. The `animation` property matches the `transition` names you used in the `slideDownAnimation` defined in `animations.ts`.
-
+
+
-
-Applying route animations to individual components works for a simple demo, but in a real life app,
-it is better to animate routes based on _route paths_.
-
-
-
+When switching between the two routes, the `HeroDetailComponent` and `HeroListComponent` will ease in from the left when routed to and will slide to the right when navigating away.
@@ -2250,7 +2241,7 @@ You've learned how to do the following:
* Navigate imperatively from one component to another.
* Pass information along in route parameters and subscribe to them in the component.
* Import the feature area NgModule into the `AppModule`.
-* Apply animations to the route component.
+* Applying routable animations based on the page.
After these changes, the folder structure looks like this:
@@ -2355,7 +2346,7 @@ Here are the relevant files for this version of the sample application.
-
+
@@ -2383,7 +2374,7 @@ Here are the relevant files for this version of the sample application.
-
+