91 lines
3.6 KiB
Plaintext
91 lines
3.6 KiB
Plaintext
include ../_util-fns
|
|
|
|
:marked
|
|
# Component Lifecycle
|
|
A Component has a lifecycle managed by Angular itself. Angular creates it, renders it, creates and renders its children,
|
|
checks it when its data-bound properties change, and destroys it before removing it from the DOM.
|
|
|
|
Angular offers **Lifecycle hooks**
|
|
that give us visibility into these key moments and the ability to act when they occur.
|
|
|
|
We cover these hooks in this chapter and demonstrate how they work in code.
|
|
|
|
[Live Example](/resources/live-examples/lifecycle-hooks/ts/plnkr.html)
|
|
|
|
<!--
|
|
https://github.com/angular/angular/blob/master/modules/angular2/src/core/linker/interfaces.ts
|
|
-->
|
|
|
|
.l-main-section
|
|
:marked
|
|
## The Lifecycle Hooks
|
|
Directive and component instances have a lifecycle
|
|
as Angular creates, updates, and destroys them.
|
|
|
|
Developers can tap into key moments in that lifecycle by implementing
|
|
one or more of the "Lifecycle Hook" interfaces, all of them available
|
|
in the `angular2/core` library.
|
|
|
|
Here is the complete lifecycle hook interface inventory:
|
|
|
|
* `OnInit`
|
|
* `OnDestroy`
|
|
* `DoCheck`
|
|
* `OnChanges`
|
|
* `AfterContentInit`
|
|
* `AfterContentChecked`
|
|
* `AfterViewInit`
|
|
* `AfterViewChecked`
|
|
|
|
No directive or component will implement all of them and some of them only make
|
|
sense for components.
|
|
|
|
Each interface has a single hook method whose name is the interface name prefixed with `ng`.
|
|
For example, the `OnInit` interface has a hook method named `ngOnInit`.
|
|
|
|
Angular calls these hook methods in the following order:
|
|
* `ngOnChanges` - called when an input or output binding value changes
|
|
* `ngOnInit` - after the first `ngOnChanges`
|
|
* `ngDoCheck` - developer's custom change detection
|
|
* `ngAfterContentInit` - after component content initialized
|
|
* `ngAfterContentChecked` - after every check of component content
|
|
* `ngAfterViewInit` - after component's view(s) are initialized
|
|
* `ngAfterViewChecked` - after every check of a component's view(s)
|
|
* `ngOnDestroy` - just before the directive is destroyed.
|
|
|
|
The [live example](/resources/live-examples/lifecycle-hooks/ts/plnkr.html) demonstrates
|
|
these hooks.
|
|
|
|
:marked
|
|
## Peek-a-boo
|
|
The `PeekABooComponent` demonstrates all of the hooks in the same component.
|
|
.l-sub-section
|
|
:marked
|
|
Except for `DoCheck`. If our component superseded regular Angular change detection
|
|
with its own change detection processing
|
|
we would also add a `ngDoCheck` method. We would **not** implement `ngOnChanges`.
|
|
We write either `ngOnChanges` or `ngDoCheck`, not both.
|
|
|
|
Custom change detection and `ngDoCheck` are on our documentation backlog.
|
|
:marked
|
|
Peek-a-boo is a demo. We'd rarely if ever implement all interfaces like this in real life.
|
|
|
|
We look forward to explaining the Peek-a-boo example and the other lifecycle hook examples in
|
|
an update to this chapter. Meanwhile, please enjoy poking around in the
|
|
[code](/resources/live-examples/lifecycle-hooks/ts/plnkr.html).
|
|
|
|
## Interface optional?
|
|
The lifecycle interfaces are optional.
|
|
We recommend adding them to benefit from TypeScript's strong typing and editor tooling.
|
|
|
|
But they disappear from the transpiled JavaScript.
|
|
Angular can't see them at runtime. And they are useless to someone developing in
|
|
a language without interfaces (such as pure JavaScript).
|
|
|
|
Fortunately, they aren't necessary.
|
|
We don't have to add the lifecycle hook interfaces to our directives and components to benefit from the hooks themselves.
|
|
|
|
Angular instead inspects our directive and component classes
|
|
and calls the hook methods *if they are defined*.
|
|
Angular will find and call methods like `ngOnInit()`, with or without the interfaces.
|