docs: edit displaying-data page to introduce section (#35507)

PR Close #35507
This commit is contained in:
Judy Bogart 2020-02-17 10:25:09 -08:00 committed by Miško Hevery
parent 4c693ea817
commit 1b72fc10eb
2 changed files with 39 additions and 88 deletions

View File

@ -11,6 +11,8 @@ about the features and tools that can help you develop and deliver Angular appli
## Application architecture ## Application architecture
* The [Components and templates](guide/displaying-data) guide explains how to connect the application data in your [components](guide/glossary#component) to your page-display [templates](guide/glossary#template), to create a complete interactive application.
* The [NgModules](guide/ngmodules) guide provides in-depth information on the modular structure of an Angular application. * The [NgModules](guide/ngmodules) guide provides in-depth information on the modular structure of an Angular application.
* The [Routing and navigation](guide/router) guide provides in-depth information on how to construct applications that allow a user to navigate to different [views](guide/glossary#view) within your single-page app. * The [Routing and navigation](guide/router) guide provides in-depth information on how to construct applications that allow a user to navigate to different [views](guide/glossary#view) within your single-page app.

View File

@ -1,11 +1,20 @@
# Displaying data # Displaying data in views
You can display data by binding controls in an HTML template to properties of an Angular component. Angular [components](guide/glossary#component) form the data structure of your application.
The HTML [template](guide/glossary#template) associated with a component provides the means to display that data in the context of a web page.
Together, a component's class and template form a [view](guide/glossary#view) of your application data.
In this page, you'll create a component with a list of heroes. The process of combining data values with their representation on the page is called [data binding](guide/glossary#data-binding).
You'll display the list of hero names and You display your data to a user (and collect data from the user) by *binding* controls in the HTML template to the data properties of the component class.
conditionally show a message below the list.
In addition, you can add logic to the template by including [directives](guide/glossary#directive), which tell Angular how to modify the page as it is rendered.
Angular defines a *template language* that expands HTML notation with syntax that allows you to define various kinds of data binding and logical directives.
When the page is rendered, Angular interprets the template syntax to update the HTML according to your logic and current data state.
Before you read the complete [template syntax guide](guide/template-syntax), the exercises on this page give you a quick demonstration of how template syntax works.
In this demo, you'll create a component with a list of heroes.
You'll display the list of hero names and conditionally show a message below the list.
The final UI looks like this: The final UI looks like this:
<div class="lightbox"> <div class="lightbox">
@ -14,20 +23,14 @@ The final UI looks like this:
<div class="alert is-helpful"> <div class="alert is-helpful">
The <live-example></live-example> demonstrates all of the syntax and code snippets described in this page.
The <live-example></live-example> demonstrates all of the syntax and code
snippets described in this page.
</div> </div>
{@a interpolation} {@a interpolation}
## Showing component properties with interpolation ## Showing component properties with interpolation
The easiest way to display a component property The easiest way to display a component property is to bind the property name through interpolation.
is to bind the property name through interpolation.
With interpolation, you put the property name in the view template, enclosed in double curly braces: `{{myHero}}`. With interpolation, you put the property name in the view template, enclosed in double curly braces: `{{myHero}}`.
Use the CLI command [`ng new displaying-data`](cli/new) to create a workspace and app named `displaying-data`. Use the CLI command [`ng new displaying-data`](cli/new) to create a workspace and app named `displaying-data`.
@ -39,63 +42,43 @@ changing the template and the body of the component.
When you're done, it should look like this: When you're done, it should look like this:
<code-example path="displaying-data/src/app/app.component.1.ts" header="src/app/app.component.ts"></code-example> <code-example path="displaying-data/src/app/app.component.1.ts" header="src/app/app.component.ts"></code-example>
You added two properties to the formerly empty component: `title` and `myHero`. You added two properties to the formerly empty component: `title` and `myHero`.
The template displays the two component properties using double curly brace The template displays the two component properties using double curly brace
interpolation: interpolation:
<code-example path="displaying-data/src/app/app.component.1.ts" header="src/app/app.component.ts (template)" region="template"></code-example> <code-example path="displaying-data/src/app/app.component.1.ts" header="src/app/app.component.ts (template)" region="template"></code-example>
<div class="alert is-helpful"> <div class="alert is-helpful">
The template is a multi-line string within ECMAScript 2015 backticks (<code>\`</code>). The template is a multi-line string within ECMAScript 2015 backticks (<code>\`</code>).
The backtick (<code>\`</code>)&mdash;which is *not* the same character as a single The backtick (<code>\`</code>)&mdash;which is *not* the same character as a single
quote (`'`)&mdash;allows you to compose a string over several lines, which makes the quote (`'`)&mdash;allows you to compose a string over several lines, which makes the
HTML more readable. HTML more readable.
</div> </div>
Angular automatically pulls the value of the `title` and `myHero` properties from the component and Angular automatically pulls the value of the `title` and `myHero` properties from the component and
inserts those values into the browser. Angular updates the display inserts those values into the browser. Angular updates the display
when these properties change. when these properties change.
<div class="alert is-helpful"> <div class="alert is-helpful">
More precisely, the redisplay occurs after some kind of asynchronous event related to More precisely, the redisplay occurs after some kind of asynchronous event related to
the view, such as a keystroke, a timer completion, or a response to an HTTP request. the view, such as a keystroke, a timer completion, or a response to an HTTP request.
</div> </div>
Notice that you don't call **new** to create an instance of the `AppComponent` class. Notice that you don't call **new** to create an instance of the `AppComponent` class.
Angular is creating an instance for you. How? Angular is creating an instance for you. How?
The CSS `selector` in the `@Component` decorator specifies an element named `<app-root>`. The CSS `selector` in the `@Component` decorator specifies an element named `<app-root>`.
That element is a placeholder in the body of your `index.html` file: That element is a placeholder in the body of your `index.html` file:
<code-example path="displaying-data/src/index.html" header="src/index.html (body)" region="body"></code-example> <code-example path="displaying-data/src/index.html" header="src/index.html (body)" region="body"></code-example>
When you bootstrap with the `AppComponent` class (in <code>main.ts</code>), Angular looks for a `<app-root>` When you bootstrap with the `AppComponent` class (in <code>main.ts</code>), Angular looks for a `<app-root>`
in the `index.html`, finds it, instantiates an instance of `AppComponent`, and renders it in the `index.html`, finds it, instantiates an instance of `AppComponent`, and renders it
inside the `<app-root>` tag. inside the `<app-root>` tag.
@ -109,45 +92,44 @@ Now run the app. It should display the title and hero name:
The next few sections review some of the coding choices in the app. The next few sections review some of the coding choices in the app.
## Template inline or template file? ## Choosing the template source
The `@Component` metadata tells Angular where to find the component's template.
You can store your component's template in one of two places. You can store your component's template in one of two places.
You can define it *inline* using the `template` property, or you can define
the template in a separate HTML file and link to it in
the component metadata using the `@Component` decorator's `templateUrl` property.
The choice between inline and separate HTML is a matter of taste, * You can define the template *inline* using the `template` property of the `@Component` decorator. An inline template is useful for a small demo or test.
circumstances, and organization policy. * Alternatively, you can define the template in a separate HTML file and link to that file in the `templateUrl` property of the `@Component` decorator. This configuration is typical for anything more complex than a small test or demo, and is the default when you generate a new component.
Here the app uses inline HTML because the template is small and the demo
is simpler without the additional HTML file.
In either style, the template data bindings have the same access to the component's properties. In either style, the template data bindings have the same access to the component's properties.
Here the app uses inline HTML because the template is small and the demo is simpler without the additional HTML file.
<div class="alert is-helpful"> <div class="alert is-helpful">
By default, the Angular CLI command [`ng generate component`](cli/generate) generates components with a template file. You can override that with: By default, the Angular CLI command [`ng generate component`](cli/generate) generates components with a template file.
You can override that by adding the "-t" (short for `inlineTemplate=true`) option:
<code-example hideCopy language="sh" class="code-shell"> <code-example hideCopy language="sh" class="code-shell">
ng generate component hero -it ng generate component hero -t
</code-example> </code-example>
</div> </div>
## Constructor or variable initialization? ## Initialization
Although this example uses variable assignment to initialize the components, you could instead declare and initialize the properties using a constructor:
The following example uses variable assignment to initialize the components.
<code-example path="displaying-data/src/app/app-ctor.component.1.ts" region="class"></code-example> <code-example path="displaying-data/src/app/app-ctor.component.1.ts" region="class"></code-example>
You could instead declare and initialize the properties using a constructor.
This app uses more terse "variable assignment" style simply for brevity.
This app uses more terse "variable assignment" style simply for brevity.
{@a ngFor} {@a ngFor}
## Showing an array property with ***ngFor** ## Add logic to loop through data
The `*ngFor` directive (predefined by Angular) lets you loop through data. The following example uses the directive to show all of the values in an array property.
To display a list of heroes, begin by adding an array of hero names to the component and redefine `myHero` to be the first name in the array. To display a list of heroes, begin by adding an array of hero names to the component and redefine `myHero` to be the first name in the array.
@ -155,15 +137,12 @@ To display a list of heroes, begin by adding an array of hero names to the compo
<code-example path="displaying-data/src/app/app.component.2.ts" header="src/app/app.component.ts (class)" region="class"></code-example> <code-example path="displaying-data/src/app/app.component.2.ts" header="src/app/app.component.ts (class)" region="class"></code-example>
Now use the Angular `ngFor` directive in the template to display each item in the `heroes` list.
Now use the Angular `ngFor` directive in the template to display
each item in the `heroes` list.
<code-example path="displaying-data/src/app/app.component.2.ts" header="src/app/app.component.ts (template)" region="template"></code-example> <code-example path="displaying-data/src/app/app.component.2.ts" header="src/app/app.component.ts (template)" region="template"></code-example>
This UI uses the HTML unordered list with `<ul>` and `<li>` tags. The `*ngFor` This UI uses the HTML unordered list with `<ul>` and `<li>` tags. The `*ngFor`
in the `<li>` element is the Angular "repeater" directive. in the `<li>` element is the Angular "repeater" directive.
It marks that `<li>` element (and its children) as the "repeater template": It marks that `<li>` element (and its children) as the "repeater template":
@ -171,20 +150,13 @@ It marks that `<li>` element (and its children) as the "repeater template":
<code-example path="displaying-data/src/app/app.component.2.ts" header="src/app/app.component.ts (li)" region="li"></code-example> <code-example path="displaying-data/src/app/app.component.2.ts" header="src/app/app.component.ts (li)" region="li"></code-example>
<div class="alert is-important"> <div class="alert is-important">
Don't forget the leading asterisk (\*) in `*ngFor`. It is an essential part of the syntax. Don't forget the leading asterisk (\*) in `*ngFor`. It is an essential part of the syntax.
For more information, see the [Template Syntax](guide/template-syntax#ngFor) page. For more information, see the [Template Syntax](guide/template-syntax#ngFor) page.
</div> </div>
Notice the `hero` in the `ngFor` double-quoted instruction; Notice the `hero` in the `ngFor` double-quoted instruction;
it is an example of a template input variable. Read it is an example of a template input variable. Read
more about template input variables in the [microsyntax](guide/template-syntax#microsyntax) section of more about template input variables in the [microsyntax](guide/template-syntax#microsyntax) section of
@ -194,18 +166,13 @@ Angular duplicates the `<li>` for each item in the list, setting the `hero` vari
to the item (the hero) in the current iteration. Angular uses that variable as the to the item (the hero) in the current iteration. Angular uses that variable as the
context for the interpolation in the double curly braces. context for the interpolation in the double curly braces.
<div class="alert is-helpful"> <div class="alert is-helpful">
In this case, `ngFor` is displaying an array, but `ngFor` can In this case, `ngFor` is displaying an array, but `ngFor` can
repeat items for any [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) object. repeat items for any [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) object.
</div> </div>
Now the heroes appear in an unordered list. Now the heroes appear in an unordered list.
<div class="lightbox"> <div class="lightbox">
@ -228,13 +195,11 @@ of hero names into an array of `Hero` objects. For that you'll need a `Hero` cla
ng generate class hero ng generate class hero
</code-example> </code-example>
With the following code: This command creates the following code.
<code-example path="displaying-data/src/app/hero.ts" header="src/app/hero.ts"></code-example> <code-example path="displaying-data/src/app/hero.ts" header="src/app/hero.ts"></code-example>
You've defined a class with a constructor and two properties: `id` and `name`. You've defined a class with a constructor and two properties: `id` and `name`.
It might not look like the class has properties, but it does. It might not look like the class has properties, but it does.
@ -245,8 +210,6 @@ Consider the first parameter:
<code-example path="displaying-data/src/app/hero.ts" header="src/app/hero.ts (id)" region="id"></code-example> <code-example path="displaying-data/src/app/hero.ts" header="src/app/hero.ts (id)" region="id"></code-example>
That brief syntax does a lot: That brief syntax does a lot:
* Declares a constructor parameter and its type. * Declares a constructor parameter and its type.
@ -254,7 +217,6 @@ That brief syntax does a lot:
* Initializes that property with the corresponding argument when creating an instance of the class. * Initializes that property with the corresponding argument when creating an instance of the class.
### Using the Hero class ### Using the Hero class
After importing the `Hero` class, the `AppComponent.heroes` property can return a _typed_ array After importing the `Hero` class, the `AppComponent.heroes` property can return a _typed_ array
@ -273,7 +235,6 @@ Fix that to display only the hero's `name` property.
<code-example path="displaying-data/src/app/app.component.3.ts" header="src/app/app.component.ts (template)" region="template"></code-example> <code-example path="displaying-data/src/app/app.component.3.ts" header="src/app/app.component.ts (template)" region="template"></code-example>
The display looks the same, but the code is clearer. The display looks the same, but the code is clearer.
{@a ngIf} {@a ngIf}
@ -291,46 +252,35 @@ To see it in action, add the following paragraph at the bottom of the template:
<code-example path="displaying-data/src/app/app.component.ts" header="src/app/app.component.ts (message)" region="message"></code-example> <code-example path="displaying-data/src/app/app.component.ts" header="src/app/app.component.ts (message)" region="message"></code-example>
<div class="alert is-important"> <div class="alert is-important">
Don't forget the leading asterisk (\*) in `*ngIf`. It is an essential part of the syntax. Don't forget the leading asterisk (\*) in `*ngIf`. It is an essential part of the syntax.
Read more about `ngIf` and `*` in the [ngIf section](guide/template-syntax#ngIf) of the [Template Syntax](guide/template-syntax) page. Read more about `ngIf` and `*` in the [ngIf section](guide/template-syntax#ngIf) of the [Template Syntax](guide/template-syntax) page.
</div> </div>
The template expression inside the double quotes, The template expression inside the double quotes,
`*ngIf="heroes.length > 3"`, looks and behaves much like TypeScript. `*ngIf="heroes.length > 3"`, looks and behaves much like TypeScript.
When the component's list of heroes has more than three items, Angular adds the paragraph When the component's list of heroes has more than three items, Angular adds the paragraph
to the DOM and the message appears. If there are three or fewer items, Angular omits the to the DOM and the message appears.
paragraph, so no message appears. For more information, If there are three or fewer items, Angular omits the paragraph, so no message appears.
see the [template expressions](guide/template-syntax#template-expressions) section of the
[Template Syntax](guide/template-syntax) page. For more information, see [template expressions](guide/template-syntax#template-expressions).
<div class="alert is-helpful"> <div class="alert is-helpful">
Angular isn't showing and hiding the message. It is adding and removing the paragraph element from the DOM. That improves performance, especially in larger projects when conditionally including or excluding Angular isn't showing and hiding the message. It is adding and removing the paragraph element from the DOM. That improves performance, especially in larger projects when conditionally including or excluding
big chunks of HTML with many data bindings. big chunks of HTML with many data bindings.
</div> </div>
Try it out. Because the array has four items, the message should appear. Try it out. Because the array has four items, the message should appear.
Go back into <code>app.component.ts</code> and delete or comment out one of the elements from the heroes array. Go back into <code>app.component.ts</code> and delete or comment out one of the elements from the heroes array.
The browser should refresh automatically and the message should disappear. The browser should refresh automatically and the message should disappear.
## Summary ## Summary
Now you know how to use: Now you know how to use:
@ -341,7 +291,6 @@ Now you know how to use:
Here's the final code: Here's the final code:
<code-tabs> <code-tabs>
<code-pane header="src/app/app.component.ts" path="displaying-data/src/app/app.component.ts" region="final"> <code-pane header="src/app/app.component.ts" path="displaying-data/src/app/app.component.ts" region="final">