2020-11-05 16:11:47 -05:00
# Getting started with Angular
2019-03-20 11:10:47 -04:00
Welcome to Angular!
2020-11-05 16:11:47 -05:00
This tutorial introduces you to the essentials of Angular by walking you through building an e-commerce site with a catalog, shopping cart, and check-out form.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
To help you get started right away, this tutorial uses a ready-made application that you can examine and modify interactively on [Stackblitz ](https://stackblitz.com/ )— without having to [set up a local work environment ](guide/setup-local "Setup guide" ).
StackBlitz is a browser-based development environment where you can create, save, and share projects using a variety of technologies.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
## Prerequisites
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
To get the most out of this tutorial you should already have a basic understanding of the following.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
* [HTML ](https://developer.mozilla.org/en-US/docs/Learn/HTML "Learning HTML: Guides and tutorials" )
* [JavaScript ](https://developer.mozilla.org/en-US/docs/Web/JavaScript "JavaScript" )
2021-01-13 10:43:40 -05:00
* [TypeScript ](https://www.typescriptlang.org/ "The TypeScript language" )
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
{@a components}
## Take a tour of the example application
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
You build Angular applications with components.
Components define areas of responsibility in the UI that let you reuse sets of UI functionality.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
A component consists of three things:
* **A component class** that handles data and functionality.
* **An HTML template** that determines the UI.
* **Component-specific styles** that define the look and feel.
2019-11-04 11:27:42 -05:00
2020-11-05 16:11:47 -05:00
This guide demonstrates building an application with the following components.
2019-11-04 11:27:42 -05:00
2020-11-05 16:11:47 -05:00
* `<app-root>` — the first component to load and the container for the other components.
* `<app-top-bar>` — the store name and checkout button.
* `<app-product-list>` — the product list.
* `<app-product-alerts>` — a component that contains the application's alerts.
2019-11-04 11:27:42 -05:00
2020-11-05 16:11:47 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/start/app-components.png" alt = "Online store with three components" >
2019-11-04 11:27:42 -05:00
< / div >
2020-11-05 16:11:47 -05:00
For more information about components, see [Introduction to Components ](guide/architecture-components "Introduction to Components and Templates" ).
{@a new-project}
## Create the sample project
2019-11-04 11:27:42 -05:00
2020-11-05 16:11:47 -05:00
To create the sample project, generate the < live-example name = "getting-started-v0" noDownload > ready-made sample project in StackBlitz< / live-example > .
To save your work:
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Log into StackBlitz.
1. Fork the project you generated.
1. Save periodically.
2019-09-19 14:53:14 -04:00
2020-11-05 16:11:47 -05:00
In StackBlitz, the preview pane on the right shows the starting state of the example application.
The preview features two areas:
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
* a top bar with the store name, *My Store* , and a checkout button
* a header for a product list, *Products*
2019-09-19 14:53:14 -04:00
2020-11-05 16:11:47 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/start/new-app-all.gif" alt = "Starter online store application" >
2019-09-19 14:53:14 -04:00
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
The project section on the left shows the source files that make up the application, including the infrastructure and configuration files.
2019-03-20 11:10:47 -04:00
2021-05-06 18:26:02 -04:00
When you generate the StackBlitz example applications that accompany the tutorials, StackBlitz creates the starter files and mock data for you.
2020-11-05 16:11:47 -05:00
The files you use throughout the tutorial are in the `src` folder.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
For more information on how to use StackBlitz, see the [StackBlitz documentation ](https://developer.stackblitz.com/docs/platform/ ).
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
{@a product-list}
## Create the product list
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
In this section, you'll update the application to display a list of products.
You'll use predefined product data from the `products.ts` file and methods from the `product-list.component.ts` file.
This section guides you through editing the HTML, also known as the template.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. In the `product-list` folder, open the template file `product-list.component.html` .
2019-05-30 08:01:19 -04:00
2020-11-05 16:11:47 -05:00
1. Add an `*ngFor` structural directive on a `<div>` , as follows.
2019-09-18 16:09:56 -04:00
2020-11-05 16:11:47 -05:00
< code-example header = "src/app/product-list/product-list.component.html" path = "getting-started/src/app/product-list/product-list.component.2.html" region = "ngfor" >
< / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
With `*ngFor` , the `<div>` repeats for each product in the list.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
Structural directives shape or reshape the DOM's structure, by adding, removing, and manipulating elements.
For more information about structural directives, see [Structural directives ](guide/structural-directives ).
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Inside the `<div>` , add an `<h3>` and `{{ product.name }}` .
The `{{ product.name }}` statement is an example of Angular's interpolation syntax.
Interpolation `{{ }}` lets you render the property value as text.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example path = "getting-started/src/app/product-list/product-list.component.2.html" header = "src/app/product-list/product-list.component.html" region = "interpolation" >
< / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
The preview pane updates to display the name of each product in the list.
< div class = "lightbox" >
< img src = "generated/images/guide/start/template-syntax-product-names.png" alt = "Product names added to list" >
< / div >
1. To make each product name a link to product details, add the `<a>` element around `{{ product.name }}` .
1. Set the title to be the product's name by using the property binding `[ ]` syntax, as follows:
2019-03-20 11:10:47 -04:00
2019-09-18 16:09:56 -04:00
< code-example path = "getting-started/src/app/product-list/product-list.component.2.html" header = "src/app/product-list/product-list.component.html" >
2019-03-20 11:10:47 -04:00
< / code-example >
2020-11-05 16:11:47 -05:00
In the preview pane, hover over a product name to see the bound name property value, which is the product name plus the word "details".
Property binding `[ ]` lets you use the property value in a template expression.
2019-03-20 11:10:47 -04:00
2019-11-11 17:47:51 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/start/template-syntax-product-anchor.png" alt = "Product name anchor text is product name property" >
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Add the product descriptions. On a `<p>` element, use an `*ngIf` directive so that Angular only creates the `<p>` element if the current product has a description.
2019-09-18 16:09:56 -04:00
< code-example path = "getting-started/src/app/product-list/product-list.component.3.html" header = "src/app/product-list/product-list.component.html" >
2019-03-20 11:10:47 -04:00
< / code-example >
2020-11-05 16:11:47 -05:00
The application now displays the name and description of each product in the list.
Notice that the final product does not have a description paragraph.
Angular doesn't create the `<p>` element because the product's description property is empty.
2019-03-20 11:10:47 -04:00
2019-11-11 17:47:51 -05:00
< div class = "lightbox" >
2019-04-02 02:12:55 -04:00
< img src = "generated/images/guide/start/template-syntax-product-description.png" alt = "Product descriptions added to list" >
2019-11-11 17:47:51 -05:00
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Add a button so users can share a product.
Bind the button's `click` event to the `share()` method in `product-list.component.ts` . Event binding uses a set of parentheses, `( )` , around the event, as in the `(click)` event on the `<button>` element.
2019-03-20 11:10:47 -04:00
2019-09-18 16:09:56 -04:00
< code-example path = "getting-started/src/app/product-list/product-list.component.4.html" header = "src/app/product-list/product-list.component.html" >
2019-03-20 11:10:47 -04:00
< / code-example >
2020-11-05 16:11:47 -05:00
Each product now has a **Share** button.
2019-03-20 11:10:47 -04:00
2019-11-11 17:47:51 -05:00
< div class = "lightbox" >
2019-04-02 02:12:55 -04:00
< img src = "generated/images/guide/start/template-syntax-product-share-button.png" alt = "Share button added for each product" >
2019-11-11 17:47:51 -05:00
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
Clicking the **Share** button triggers an alert that states, "The product has been shared!".
2019-03-20 11:10:47 -04:00
2019-11-11 17:47:51 -05:00
< div class = "lightbox" >
2019-04-02 02:12:55 -04:00
< img src = "generated/images/guide/start/template-syntax-product-share-alert.png" alt = "Alert box indicating product has been shared" >
2019-11-11 17:47:51 -05:00
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
In editing the template, you have explored some of the most popular features of Angular templates.
For more information, see [Introduction to components and templates ](guide/architecture-components#template-syntax "Template Syntax" ).
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
{@a passing-data-in}
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
## Pass data to a child component
2019-03-20 11:10:47 -04:00
2019-09-18 16:09:56 -04:00
Currently, the product list displays the name and description of each product.
2020-11-05 16:11:47 -05:00
The `ProductListComponent` also defines a `products` property that contains imported data for each product from the `products` array in `products.ts` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
The next step is to create a new alert feature that uses product data from the `ProductListComponent` .
The alert checks the product's price, and, if the price is greater than $700, displays a **Notify Me** button that lets users sign up for notifications when the product goes on sale.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
This section walks you through creating a child component, `ProductAlertsComponent` that can receive data from its parent component, `ProductListComponent` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Right click on the `app` folder and use the `Angular Generator` to generate a new component named `product-alerts` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/start/generate-component.png" alt = "StackBlitz command to generate component" >
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
The generator creates starter files for the three parts of the component:
* `product-alerts.component.ts`
* `product-alerts.component.html`
* `product-alerts.component.css`
2019-03-20 11:10:47 -04:00
1. Open `product-alerts.component.ts` .
2020-11-05 16:11:47 -05:00
The `@Component()` decorator indicates that the following class is a component.
`@Component()` also provides metadata about the component, including its selector, templates, and styles.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example header = "src/app/product-alerts/product-alerts.component.ts" path = "getting-started/src/app/product-alerts/product-alerts.component.1.ts" region = "as-generated" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
Key features in the `@Component()` are as follows:
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
* The `selector` , `app-product-alerts` , identifies the component.
By convention, Angular component selectors begin with the prefix `app-` , followed by the component name.
* The template and style filenames reference the component's HTML and CSS.
* The `@Component()` definition also exports the class, `ProductAlertsComponent` , which handles functionality for the component.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. To set up `ProductAlertsComponent` to receive product data, first import `Input` from `@angular/core` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example path = "getting-started/src/app/product-alerts/product-alerts.component.1.ts" region = "imports" header = "src/app/product-alerts/product-alerts.component.ts" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. In the `ProductAlertsComponent` class definition, define a property named `product` with an `@Input()` decorator.
The `@Input()` decorator indicates that the property value passes in from the component's parent, `ProductListComponent` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example path = "getting-started/src/app/product-alerts/product-alerts.component.1.ts" region = "input-decorator" header = "src/app/product-alerts/product-alerts.component.ts" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Open `product-alerts.component.html` and replace the placeholder paragraph with a **Notify Me** button that appears if the product price is over $700.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example header = "src/app/product-alerts/product-alerts.component.html" path = "getting-started/src/app/product-alerts/product-alerts.component.1.html" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. To display `ProductAlertsComponent` as a child of `ProductListComponent` , add the selector, `<app-product-alerts>` to `product-list.component.html` .
Pass the current product as input to the component using property binding.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example header = "src/app/product-list/product-list.component.html" path = "getting-started/src/app/product-list/product-list.component.5.html" region = "app-product-alerts" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
The new product alert component takes a product as input from the product list.
With that input, it shows or hides the **Notify Me** button, based on the price of the product.
The Phone XL price is over $700, so the **Notify Me** button appears on that product.
2019-03-20 11:10:47 -04:00
2019-11-11 17:47:51 -05:00
< div class = "lightbox" >
2019-04-02 02:12:55 -04:00
< img src = "generated/images/guide/start/product-alert-button.png" alt = "Product alert button added to products over $700" >
2019-11-11 17:47:51 -05:00
< / div >
2019-03-20 11:10:47 -04:00
{@a output}
2020-11-05 16:11:47 -05:00
## Pass data to a parent component
2019-09-19 14:53:14 -04:00
2020-11-05 16:11:47 -05:00
To make the **Notify Me** button work, the child component needs to notify and pass the data to the parent component.
The `ProductAlertsComponent` needs to emit an event when the user clicks **Notify Me** and the `ProductListComponent` needs to respond to the event.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. In `product-alerts.component.ts` , import `Output` and `EventEmitter` from `@angular/core` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example header = "src/app/product-alerts/product-alerts.component.ts" path = "getting-started/src/app/product-alerts/product-alerts.component.ts" region = "imports" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. In the component class, define a property named `notify` with an `@Output()` decorator and an instance of `EventEmitter()` .
Configuring `ProductAlertsComponent` with an `@Output()` allows the `ProductAlertsComponent` to emit an event when the value of the `notify` property changes.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example path = "getting-started/src/app/product-alerts/product-alerts.component.ts" header = "src/app/product-alerts/product-alerts.component.ts" region = "input-output" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< div class = "alert is-helpful" >
2020-01-09 22:51:32 -05:00
2020-11-05 16:11:47 -05:00
In new components, the Angular Generator includes an empty `constructor()` , the `OnInit` interface, and the `ngOnInit()` method.
Since these steps don't use them, the following code example omits them for brevity.
2020-01-09 22:51:32 -05:00
2020-11-05 16:11:47 -05:00
< / div >
2020-01-09 22:51:32 -05:00
2020-11-05 16:11:47 -05:00
1. In `product-alerts.component.html` , update the **Notify Me** button with an event binding to call the `notify.emit()` method.
2019-03-20 11:10:47 -04:00
< code-example header = "src/app/product-alerts/product-alerts.component.html" path = "getting-started/src/app/product-alerts/product-alerts.component.html" > < / code-example >
2020-11-05 16:11:47 -05:00
1. Define the behavior that happens when the user clicks the button.
The parent, `ProductListComponent` — not the `ProductAlertsComponent` — acts when the child raises the event.
In `product-list.component.ts` , define an `onNotify()` method, similar to the `share()` method.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< code-example header = "src/app/product-list/product-list.component.ts" path = "getting-started/src/app/product-list/product-list.component.ts" region = "on-notify" > < / code-example >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
1. Update the `ProductListComponent` to receive data from the `ProductAlertsComponent` .
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
In `product-list.component.html` , bind `<app-product-alerts>` to the `onNotify()` method of the product list component.
`<app-product-alerts>` is what displays the **Notify Me** button.
2019-03-20 11:10:47 -04:00
< code-example header = "src/app/product-list/product-list.component.html" path = "getting-started/src/app/product-list/product-list.component.6.html" region = "on-notify" > < / code-example >
2020-11-05 16:11:47 -05:00
1. Click the **Notify Me** button to trigger an alert which reads, "You will be notified when the product goes on sale".
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/start/product-alert-notification.png" alt = "Product alert notification confirmation dialog" >
< / div >
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
For more information on communication between components, see [Component Interaction ](guide/component-interaction "Component interaction" ).
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
{@a whats-next}
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
## What's next
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
In this section, you've created an application that iterates through data and features components that communicate with each other.
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
To continue exploring Angular and developing this application:
2019-03-20 11:10:47 -04:00
2020-11-05 16:11:47 -05:00
* Continue to [In-app navigation ](start/start-routing "Getting started: In-app navigation" ) to create a product details page.
2021-05-06 18:26:02 -04:00
* Skip ahead to [Deployment ](start/start-deployment "Getting started: Deployment" ) to move to local development, or deploy your application to Firebase or your own server.