docs: edit displaying-data page to introduce section (#35507)
PR Close #35507
This commit is contained in:
parent
4c693ea817
commit
1b72fc10eb
|
@ -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.
|
||||||
|
|
|
@ -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>)—which is *not* the same character as a single
|
The backtick (<code>\`</code>)—which is *not* the same character as a single
|
||||||
quote (`'`)—allows you to compose a string over several lines, which makes the
|
quote (`'`)—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">
|
||||||
|
|
Loading…
Reference in New Issue