From f45c9998cc65b8eff78e741e9ea290b5b953f23d Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Sat, 24 Sep 2016 15:50:21 -0700 Subject: [PATCH] docs(lifecycle-hooks): combine what and when in one chart; add img (#2469) --- .../docs/ts/latest/guide/lifecycle-hooks.jade | 162 ++++++++---------- .../lifecycle-hooks/hooks-in-sequence.png | Bin 0 -> 15084 bytes 2 files changed, 68 insertions(+), 94 deletions(-) create mode 100644 public/resources/images/devguide/lifecycle-hooks/hooks-in-sequence.png diff --git a/public/docs/ts/latest/guide/lifecycle-hooks.jade b/public/docs/ts/latest/guide/lifecycle-hooks.jade index 9f164d8b4c..c2c5cebe4e 100644 --- a/public/docs/ts/latest/guide/lifecycle-hooks.jade +++ b/public/docs/ts/latest/guide/lifecycle-hooks.jade @@ -5,30 +5,37 @@ block includes :marked # Component Lifecycle - A Component has a lifecycle managed by Angular itself. Angular creates it, renders it, creates and renders its children, +figure + img(src="/resources/images/devguide/lifecycle-hooks/hooks-in-sequence.png" alt="Us" align="left" style="width:200px; margin-left:-40px;margin-right:30px" ) +:marked + 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 **component lifecycle hooks** - that provide visibility into these key moments and the ability to act when they occur. + Angular offers **lifecycle hooks** + that provide visibility into these key life moments and the ability to act when they occur. + A directive has the same set of lifecycle hooks, minus the hooks that are specific to component content and views. +
## Table of Contents - * [The lifecycle hooks](#hooks-overview) - * [_What_ they are](#hook-descriptions) - * [_When_ they are called](#hook-sequence) + * [Overview](#hooks-overview) +

+ * [Each hook's purpose and timing](#hooks-purpose-timing) +ifDocsFor('ts|js') :marked * [Interfaces are optional (technically)](#interface-optional) + :marked + * [Other Angular lifecycle hooks](#other-lifecycle-hooks) +

+ * [The lifecycle sample](#the-sample) + * [All](#peek-a-boo) + * [Spying OnInit and OnDestroy](#spy) + * [OnChanges](#onchanges) + * [DoCheck](#docheck) + * [AfterViewInit and AfterViewChecked](#afterview) + * [AfterContentInit and AfterContentChecked](#aftercontent) :marked - * [Other Angular lifecycle hooks](#other-lifecycle-hooks) -

- * [The lifecycle sample](#the-sample) - * [All](#peek-a-boo) - * [Spying OnInit and OnDestroy](#spy) - * [OnChanges](#onchanges) - * [DoCheck](#docheck) - * [AfterViewInit and AfterViewChecked](#afterview) - * [AfterContentInit and AfterContentChecked](#aftercontent) - Try the . a#hooks-overview @@ -48,75 +55,7 @@ a#hooks-overview No directive or component will implement all of the lifecycle hooks and some of the hooks only make sense for components. Angular only calls a directive/component hook method *if it is defined*. -a#hook-descriptions -:marked - Here are descriptions of the component lifecycle hook methods followed by a chart describing [when they are called](#hook-sequence): - - ### Directives and Components - -table(width="100%") - col(width="20%") - col(width="80%") - tr - th Hook - th Purpose - tr(style=top) - td ngOnInit - td - :marked - Initialize the directive/component after Angular initializes the data-bound input properties. - tr(style=top) - td ngOnChanges - td - :marked - Respond after Angular sets a data-bound input property. - The method receives a `changes` object of current and previous values. - tr(style=top) - td ngDoCheck - td - :marked - Detect and act upon changes that Angular can't or won't - detect on its own. Called every change detection run. - tr(style=top) - td ngOnDestroy - td - :marked - Cleanup just before Angular destroys the directive/component. - Unsubscribe observables and detach event handlers to avoid memory leaks. - -:marked - ### Components only - -table(width="100%") - col(width="20%") - col(width="80%") - tr - th Hook - th Purpose - tr(style=top) - td ngAfterContentInit - td - :marked - After Angular projects external content into its view. - tr(style=top) - td ngAfterContentChecked - td - :marked - After Angular checks the bindings of the external content that it projected into its view. - tr(style=top) - td ngAfterViewInit - td - :marked - After Angular creates the component's view(s). - tr(style=top) - td ngAfterViewChecked - td - :marked - After Angular checks the bindings of the component's view(s). -:marked - Angular does not call the hook methods in this order. - -a#hook-sequence +a#hooks-purpose-timing .l-main-section :marked ## Lifecycle sequence @@ -127,47 +66,82 @@ table(width="100%") col(width="80%") tr th Hook - th Timing + th Purpose and Timing + tr(style=top) td ngOnChanges td :marked - before `ngOnInit` and when a data-bound input property value changes. + Respond when Angular (re)sets data-bound input properties. + The method receives a `SimpleChanges` object of current and previous property values. + + Called before `ngOnInit` and whenever one or more data-bound input properties change. + tr(style=top) td ngOnInit td :marked - after the first `ngOnChanges`. + Initialize the directive/component after Angular first displays the data-bound properties + and sets the directive/component's input properties. + + Called _once_, after the _first_ `ngOnChanges`. + tr(style=top) td ngDoCheck td :marked - during every Angular change detection cycle. + Detect and act upon changes that Angular can't or won't detect on its own. + + Called during every change detection run, immediately after `ngOnChanges` and `ngOnInit`. + tr(style=top) td ngAfterContentInit td :marked - after projecting content into the component. + Respond after Angular projects external content into the component's view. + + Called _once_ after the first `NgDoCheck`. + + _A component-only hook_. + tr(style=top) td ngAfterContentChecked td :marked - after every check of projected component content. + Respond after Angular checks the content projected into the component. + + Called after the `ngAfterContentInit` and every subsequent `NgDoCheck`. + + _A component-only hook_. + tr(style=top) td ngAfterViewInit td :marked - after initializing the component's views and child views. + Respond after Angular initializes the component's views and child views. + + Called _once_ after the first `ngAfterContentChecked`. + + _A component-only hook_. + tr(style=top) td ngAfterViewChecked td :marked - after every check of the component's views and child views. + Respond after Angular checks the component's views and child views. + + Called after the `ngAfterViewInit` and every subsequent `ngAfterContentChecked`. + + _A component-only hook_. + tr(style=top) td ngOnDestroy td :marked - just before Angular destroys the directive/component. + Cleanup just before Angular destroys the directive/component. + Unsubscribe observables and detach event handlers to avoid memory leaks. + + Called _just before_ Angular destroys the directive/component. +ifDocsFor('ts|js') a#interface-optional diff --git a/public/resources/images/devguide/lifecycle-hooks/hooks-in-sequence.png b/public/resources/images/devguide/lifecycle-hooks/hooks-in-sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..128d8673af0b4049a8d7f97821988e03f3fa3228 GIT binary patch literal 15084 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 O0000u literal 0 HcmV?d00001