| 
									
										
										
										
											2016-02-05 23:27:06 -08:00
										 |  |  | include ../_util-fns | 
					
						
							| 
									
										
										
										
											2015-08-08 13:55:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | <!-- http://plnkr.co/edit/x9JYbC --> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   We typically display data in Angular by binding controls in an HTML template | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   to properties of an Angular component. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   In this chapter, we'll create a component with a list of heroes. Each hero has a name. | 
					
						
							|  |  |  |   We'll display the list of hero names and | 
					
						
							|  |  |  |   conditionally show a selected hero in a detail area below the list. | 
					
						
							| 
									
										
										
										
											2015-12-13 12:36:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   The final UI looks like this: | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | figure.image-display | 
					
						
							|  |  |  |   img(src="/resources/images/devguide/displaying-data/final.png" alt="Final UI") | 
					
						
							| 
									
										
										
										
											2016-03-16 13:51:48 +01:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-03-16 13:51:48 +01:00
										 |  |  |   # Table Of Contents | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   * [Showing component properties with interpolation](#interpolation) | 
					
						
							|  |  |  |   * [Showing an array property with NgFor](#ngFor) | 
					
						
							|  |  |  |   * [Conditional display with NgIf](#ngIf) | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  | .l-sub-section | 
					
						
							|  |  |  |   :marked | 
					
						
							|  |  |  |     The [live example](/resources/live-examples/displaying-data/ts/plnkr.html) | 
					
						
							|  |  |  |     demonstrates all of the syntax and code snippets described in this chapter. | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-28 20:43:09 -08:00
										 |  |  | <a id="interpolation"></a> | 
					
						
							| 
									
										
										
										
											2015-08-08 13:55:53 -07:00
										 |  |  | .l-main-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   ## Showing component properties with interpolation | 
					
						
							|  |  |  |   The easiest way to display a component property | 
					
						
							|  |  |  |   is to bind the property name through interpolation. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   With interpolation, we put the property name in the view template, enclosed in double curly braces: `{{myHero}}`. | 
					
						
							| 
									
										
										
										
											2015-10-19 09:38:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   Let's build a small illustrative example together. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Create a new project folder (`displaying-data`) and follow the steps in the [QuickStart](../quickstart.html). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:50:50 +01:00
										 |  |  | include ../_quickstart_repo | 
					
						
							|  |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   Then modify the `app.component.ts` file by changing the template and the body of the component. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   When we're done, it should look like this: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.1.ts', null, 'app/app.component.ts') | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   We added two properties to the formerly empty component: `title` and `myHero`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Our revised template displays the two component properties using double curly brace | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   interpolation: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.1.ts', 'template')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | .l-sub-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  |   :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |     The template is a multi-line string within ECMAScript 2015 backticks (\`). | 
					
						
							|  |  |  |     The backtick (\`) — which is *not* the same character as a single | 
					
						
							|  |  |  |     quote (') — has many nice features. The feature we're exploiting here | 
					
						
							|  |  |  |     is the ability to compose the string over several lines, which makes for | 
					
						
							|  |  |  |     much more readable HTML. | 
					
						
							| 
									
										
										
										
											2015-10-19 09:38:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   Angular automatically pulls the value of the `title` and `myHero` properties from the component and | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   inserts those values into the browser. Angular updates the display | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   when these properties change. | 
					
						
							|  |  |  | .l-sub-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  |   :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |     More precisely, the redisplay occurs after some kind of asynchronous event related to | 
					
						
							| 
									
										
										
										
											2016-01-02 16:47:30 +01:00
										 |  |  |     the view such as a keystroke, a timer completion, or an async `XHR` response. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |     We don't have those in this sample. | 
					
						
							|  |  |  |     But then the properties aren't changing on their own either. For the moment we must operate on faith. | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   Notice that we haven't called **new** to create an instance of the `AppComponent` class. | 
					
						
							|  |  |  |   Angular is creating an instance for us. How? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Notice the CSS `selector` in the `@Component` decorator that specifies an element named "my-app". | 
					
						
							|  |  |  |   Remember back in QuickStart that we added the `<my-app>` element to the body of our `index.html` | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/index.html', 'my-app')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-28 16:15:26 -08:00
										 |  |  |   When we bootstrap with the `AppComponent` class (see `main.ts`), Angular looks for a `<my-app>` | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   in the `index.html`, finds it, instantiates an instance of `AppComponent`, and renders it | 
					
						
							|  |  |  |   inside the `<my-app>` tag. | 
					
						
							| 
									
										
										
										
											2015-12-13 12:36:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   We're ready to see changes in a running app by firing up the npm script that both compiles and serves our applications | 
					
						
							|  |  |  |   while watching for changes. | 
					
						
							|  |  |  | code-example(format=""). | 
					
						
							| 
									
										
										
										
											2015-12-16 08:16:16 -08:00
										 |  |  |   npm start | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | :marked | 
					
						
							|  |  |  |   We should see the title and hero name: | 
					
						
							|  |  |  | figure.image-display | 
					
						
							|  |  |  |   img(src="/resources/images/devguide/displaying-data/title-and-hero.png" alt="Title and Hero") | 
					
						
							|  |  |  | :marked | 
					
						
							|  |  |  |   Let's review some of the choices we made and consider alternatives. | 
					
						
							| 
									
										
										
										
											2015-12-13 12:36:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   ## Template inline or template file? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   We can store our component's template in one of two places. | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   We can define it *inline* using the `template` property, as we do here. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   Or we can define the template in a separate HTML file and link to it in | 
					
						
							|  |  |  |   the component metadata using the `@Component` decorator's `templateUrl` property. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   The choice between inline and separate HTML is a matter of taste, | 
					
						
							|  |  |  |   circumstances, and organization policy. | 
					
						
							|  |  |  |   Here we're using inline HTML because the template is small, and the demo | 
					
						
							|  |  |  |   is simpler without the HTML file. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 17:29:12 -06:00
										 |  |  |   In either style, the template data bindings have the same access to the component's properties. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   ## Constructor or variable initialization? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   We initialized our component properties using variable assignment. | 
					
						
							|  |  |  |   This is a wonderfully concise and compact technique. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Some folks prefer to declare the properties and initialize them within a constructor like this: | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app-ctor.component.ts', 'app-ctor')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   That's fine too. The choice is a matter of taste and organization policy. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   We'll adopt the more terse "variable assignment" style in this chapter simply because | 
					
						
							|  |  |  |   there will be less code to read. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | <a id="ngFor"></a> | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | .l-main-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |   ## Showing an array property with ***ngFor** | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   We want to display a list of heroes. We begin by adding a mock heroes name array to the component, | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   just above `myHero`, and redefine `myHero` to be the first name in the array. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.2.ts', 'mock-heroes', 'app/app.component.ts (class)')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |   Now we use the Angular `ngFor` "repeater" directive in the template to display | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   each item in the `heroes` list. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.2.ts', 'template','app/app.component.ts (template)')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   Our presentation is the familiar HTML unordered list with `<ul>` and `<li>` tags. Let's focus on the `<li>` tag. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.2.ts', 'li-repeater')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   We added a somewhat mysterious `*ngFor` to the `<li>` element. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   That's the Angular "repeater" directive. | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Its presence on the `<li>` tag marks that `<li>` element (and its children) as the "repeater template". | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .alert.is-important | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  |   :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |     Don't forget the leading asterisk (\*) in `*ngFor`. It is an essential part of the syntax. | 
					
						
							| 
									
										
										
										
											2016-04-28 11:18:52 -07:00
										 |  |  |     Learn more about this and `ngFor` in the [Template Syntax](./template-syntax.html#ngFor) chapter. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |   Notice the `hero` in the `ngFor` double-quoted instruction;  | 
					
						
							|  |  |  |   it is an example of a [template input variable](./template-syntax.html#ngForMicrosyntax). | 
					
						
							| 
									
										
										
										
											2015-10-19 09:38:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Angular duplicates the `<li>` for each item in the list, setting the `hero` variable | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   to the item (the hero) in the current iteration. Angular uses that variable as the | 
					
						
							|  |  |  |   context for the interpolation in the double curly braces. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .l-sub-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  |   :marked | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |     We happened to give `ngFor` an array to display. | 
					
						
							|  |  |  |     In fact, `ngFor` can repeat items for any [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols) | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |     object. | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-25 09:56:16 -07:00
										 |  |  |   Assuming we're still running under the `npm start` command, | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   we should see heroes appearing in an unordered list. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | figure.image-display | 
					
						
							|  |  |  |   img(src="/resources/images/devguide/displaying-data/hero-names-list.png" alt="After ngfor") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .l-main-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   ## Creating a class for the data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   We are defining our data directly inside our component. | 
					
						
							|  |  |  |   That's fine for a demo but certainly isn't a best practice. It's not even a good practice. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   Although we won't do anything about that in this chapter, we'll make a mental note to fix this down the road. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   At the moment, we're binding to an array of strings. We do that occasionally in real applications, but | 
					
						
							|  |  |  |   most of the time we're displaying objects — potentially instances of classes. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Let's turn our array of hero names into an array of `Hero` objects. For that we'll need a `Hero` class. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   Create a new file in the `app/` folder called `hero.ts` with the following short bit of code. | 
					
						
							|  |  |  | +makeExample('displaying-data/ts/app/hero.ts', null, 'app/hero.ts')(format = ".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   We've defined a class with a constructor and two properties: `id` and `name`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   It might not look like we have properties, but we do. We're taking | 
					
						
							|  |  |  |   advantage of a TypeScript shortcut in our declaration of the constructor parameters. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Consider the first parameter: | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/hero.ts', 'id-parameter') | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   That brief syntax does a lot: | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   * declares a constructor parameter and its type | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   * declares a public property of the same name | 
					
						
							|  |  |  |   * initializes that property with the corresponding argument when we "new" an instance of the class | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .l-main-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   ## Using the Hero class | 
					
						
							|  |  |  |   Let's redefine the `heroes` property in our component to return an array of these Hero objects | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   and also set the `myHero` property with the first of these mock heroes. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.3.ts', 'heroes', 'app.component.ts (excerpt)')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   We'll have to update the template. | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   At the moment it displays the entire `hero` object, which used to be a string value. | 
					
						
							|  |  |  |   Let's fix that so we interpolate the `hero.name` property. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.3.ts', 'template','app.component.ts (template)')(format=".") | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Our display looks the same, but now we know much better what a hero really is. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | <a id="ngIf"></a> | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | .l-main-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   ## Conditional display with NgIf | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Sometimes the app should display a view or a portion of a view only under specific circumstances. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   In our example, we'd like to display a message if we have a large number of heroes — say, more than 3. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |   The Angular `ngIf` directive inserts or removes an element based on a truthy/falsey condition. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   We can see it in action by adding the following paragraph at the bottom of the template: | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeExample('displaying-data/ts/app/app.component.ts', 'message') | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | .alert.is-important | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  |   :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |     Don't forget the leading asterisk (\*) in `*ngIf`. It is an essential part of the syntax. | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |     Learn more about this and `ngIf` in the [Template Syntax](./template-syntax.html#ngIf) chapter. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   The [template expression](./template-syntax.html#template-expressions) inside the double quotes | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   looks much like JavaScript and it _is_ much like JavaScript. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   When the component's list of heroes has more than 3 items, Angular adds the paragraph to the DOM and the message appears. | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   If there are 3 or fewer items, Angular omits the paragraph, so no message appears. | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .alert.is-helpful | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  |   :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |     Angular isn't showing and hiding the message. It is adding and removing the paragraph element from the DOM. | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |     That hardly matters here. But it would matter a great deal, from a performance perspective, if | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |     we were conditionally including or excluding a big chunk of HTML with many data bindings. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Try it out. Because the array has four items, the message should appear. | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |   Go back into `app.component.ts` and delete or comment out one of the elements from the hero array. | 
					
						
							|  |  |  |   The browser should refresh automatically and the message should disappear. | 
					
						
							| 
									
										
										
										
											2015-12-13 12:36:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | .l-main-section | 
					
						
							| 
									
										
										
										
											2015-11-10 18:31:46 +00:00
										 |  |  | :marked | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  |   ## Summary | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Now we know how to use: | 
					
						
							|  |  |  |   - **interpolation** with double curly braces to display a component property | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |   - **`ngFor`** to display a list of items | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   - a TypeScript class to shape the **model data** for our component and display properties of that model | 
					
						
							| 
									
										
										
										
											2016-04-30 07:01:16 -07:00
										 |  |  |   - **`ngIf`** to conditionally display a chunk of HTML based on a boolean expression | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 10:06:01 -08:00
										 |  |  |   Here's our final code: | 
					
						
							| 
									
										
										
										
											2015-10-23 19:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  | +makeTabs(`displaying-data/ts/app/app.component.ts, | 
					
						
							|  |  |  |            displaying-data/ts/app/hero.ts, | 
					
						
							| 
									
										
										
										
											2016-01-28 16:15:26 -08:00
										 |  |  |            displaying-data/ts/app/main.ts`, | 
					
						
							| 
									
										
										
										
											2015-12-10 21:41:02 -08:00
										 |  |  |            'final,,', | 
					
						
							| 
									
										
										
										
											2016-01-28 16:15:26 -08:00
										 |  |  |            'app/app.component.ts, app/hero.ts, main.ts') |