2020-04-28 16:26:58 -04:00
# Built-in directives
2020-11-18 08:47:53 -05:00
Directives are classes that add additional behavior to elements
in your Angular applications.
With Angular's built-in directives, you can manage forms, lists, styles, and what users see.
2020-04-28 16:26:58 -04:00
< div class = "alert is-helpful" >
See the < live-example > < / live-example > for a working example containing the code snippets in this guide.
< / div >
2020-11-18 08:47:53 -05:00
The different types of Angular directives are as follows:
1. [Components ](guide/component-overview )— directives with a template.
This type of directive is the most common directive type.
1. [Attribute directives ](guide/built-in-directives#built-in-attribute-directives )— directives that change the appearance or behavior of an element, component, or another directive.
1. [Structural directives ](guide/built-in-directives#built-in-structural-directives )— directives that change the DOM layout by adding and removing DOM elements.
This guide covers built-in [attribute directives ](guide/built-in-directives#built-in-attribute-directives ) and [structural directives ](guide/built-in-directives#built-in-structural-directives ).
2020-04-28 16:26:58 -04:00
{@a attribute-directives}
## Built-in attribute directives
2020-11-18 08:47:53 -05:00
Attribute directives listen to and modify the behavior of other HTML elements, attributes, properties, and components.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
Many NgModules such as the [`RouterModule` ](guide/router "Routing and Navigation" ) and the [`FormsModule` ](guide/forms "Forms" ) define their own attribute directives.
2020-04-28 16:26:58 -04:00
The most common attribute directives are as follows:
* [`NgClass` ](guide/built-in-directives#ngClass )— adds and removes a set of CSS classes.
2020-11-18 08:47:53 -05:00
* [`NgStyle` ](guide/built-in-directives#ngstyle )— adds and removes a set of HTML styles.
2020-04-28 16:26:58 -04:00
* [`NgModel` ](guide/built-in-directives#ngModel )— adds two-way data binding to an HTML form element.
{@a ngClass}
2020-11-18 08:47:53 -05:00
## Adding and removing classes with `NgClass`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can add or remove multiple CSS classes simultaneously with `ngClass` .
2020-04-28 16:26:58 -04:00
< div class = "alert is-helpful" >
To add or remove a *single* class, use [class binding ](guide/attribute-binding#class-binding ) rather than `NgClass` .
< / div >
2020-11-18 08:47:53 -05:00
### Using `NgClass` with an expression
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
On the element you'd like to style, add `[ngClass]` and set it equal to an expression.
In this case, `isSpecial` is a boolean set to `true` in `app.component.ts` .
Because `isSpecial` is true, `ngClass` applies the class of `special` to the `<div>` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "special-div" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
### Using `NgClass` with a method
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. To use `NgClass` with a method, add the method to the component class.
In the following example, `setCurrentClasses()` sets the property `currentClasses` with an object that adds or removes three classes based on the `true` or `false` state of three other component properties.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
Each key of the object is a CSS class name.
If a key is `true` , `ngClass` adds the class.
If a key is `false` , `ngClass` removes the class.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.ts" region = "setClasses" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. In the template, add the `ngClass` property binding to `currentClasses` to set the element's classes:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgClass-1" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
For this use case, Angular applies the classes on initialization and in case of changes.
The full example calls `setCurrentClasses()` initially with `ngOnInit()` and when the dependent properties change through a button click.
These steps are not necessary to implement `ngClass` .
For more information, see the < live-example ></ live-example > `app.component.ts` and `app.component.html` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
{@a ngstyle}
## Setting inline styles with `NgStyle`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can use `NgStyle` to set multiple inline styles simultaneously, based on the state of the component.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. To use `NgStyle` , add a method to the component class.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
In the following example, `setCurrentStyles()` sets the property `currentStyles` with an object that defines three styles, based on the state of three other component properties.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.ts" region = "setStyles" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. To set the element's styles, add an `ngStyle` property binding to `currentStyles` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgStyle-2" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
For this use case, Angular applies the styles upon initialization and in case of changes.
To do this, the full example calls `setCurrentStyles()` initially with `ngOnInit()` and when the dependent properties change through a button click.
However, these steps are not necessary to implement `ngStyle` on its own.
See the < live-example ></ live-example > `app.component.ts` and `app.component.html` for this optional implementation.
2020-04-28 16:26:58 -04:00
{@a ngModel}
2020-11-18 08:47:53 -05:00
## Displaying and updating properties with `ngModel`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can use the `NgModel` directive to display a data property and update that property when the user makes changes.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. Import `FormsModule` and add it to the NgModule's `imports` list.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.module.ts" header = "src/app/app.module.ts (FormsModule import)" region = "import-forms-module" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. Add an `[(ngModel)]` binding on an HTML `<form>` element and set it equal to the property, here `name` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" header = "src/app/app.component.html (NgModel example)" region = "NgModel-1" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
This `[(ngModel)]` syntax can only set a data-bound property.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
To customize your configuration, you can write the expanded form, which separates the property and event binding.
Use [property binding ](guide/property-binding ) to set the property and [event binding ](guide/event-binding ) to respond to changes.
The following example changes the `<input>` value to uppercase:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "uppercase" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
Here are all variations in action, including the uppercase version:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< div class = "lightbox" >
< img src = 'generated/images/guide/built-in-directives/ng-model-anim.gif' alt = "NgModel variations" >
< / div >
2020-04-28 16:26:58 -04:00
### `NgModel` and value accessors
2020-11-18 08:47:53 -05:00
The `NgModel` directive works for an element supported by a [ControlValueAccessor ](api/forms/ControlValueAccessor ).
Angular provides *value accessors* for all of the basic HTML form elements.
For more information, see [Forms ](guide/forms ).
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
To apply `[(ngModel)]` to a non-form native element or a third-party custom component, you have to write a value accessor.
For more information, see the API documentation on [DefaultValueAccessor ](api/forms/DefaultValueAccessor ).
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< div class = "alert is-helpful" >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
When you write an Angular component, you don't need a value accessor or `NgModel` if you name the value and event properties according to Angular's [two-way binding syntax ](guide/two-way-binding#how-two-way-binding-works ).
2020-04-28 16:26:58 -04:00
< / div >
{@a structural-directives}
2020-11-18 08:47:53 -05:00
## Built-in structural directives
2020-04-28 16:26:58 -04:00
Structural directives are responsible for HTML layout.
2020-11-18 08:47:53 -05:00
They shape or reshape the DOM's structure, typically by adding, removing, and manipulating the host elements to which they are attached.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
This section introduces the most common built-in structural directives:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
* [`NgIf` ](guide/built-in-directives#ngIf )— conditionally creates or disposes of subviews from the template.
2020-04-28 16:26:58 -04:00
* [`NgFor` ](guide/built-in-directives#ngFor )— repeat a node for each item in a list.
* [`NgSwitch` ](guide/built-in-directives#ngSwitch )— a set of directives that switch among alternative views.
2020-11-18 08:47:53 -05:00
For more information, see [Structural Directives ](guide/structural-directives ).
2020-04-28 16:26:58 -04:00
{@a ngIf}
2020-11-18 08:47:53 -05:00
## Adding or removing an element with `NgIf`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can add or remove an element by applying an `NgIf` directive to a host element.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
When `NgIf` is `false` , Angular removes an element and its descendants from the DOM.
Angular then disposes of their components, which frees up memory and resources.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
To add or remove an element, bind `*ngIf` to a condition expression such as `isActive` in the following example.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgIf-1" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
When the `isActive` expression returns a truthy value, `NgIf` adds the `ItemDetailComponent` to the DOM.
When the expression is falsy, `NgIf` removes the `ItemDetailComponent` from the DOM and disposes of the component and all of its sub-components.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
For more information on `NgIf` and `NgIfElse` , see the [NgIf API documentation ](api/common/NgIf ).
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
### Guarding against `null`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
By default, `NgIf` prevents display of an element bound to a null value.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
To use `NgIf` to guard a `<div>` , add `*ngIf="yourProperty"` to the `<div>` .
In the following example, the `currentCustomer` name appears because there is a `currentCustomer` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgIf-2" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
However, if the property is `null` , Angular does not display the `<div>` .
In this example, Angular does not display the `nullCustomer` because it is `null` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgIf-2b" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
{@a ngFor}
## Listing items with `NgFor`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can use the `NgFor` directive to present a list of items.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. Define a block of HTML that determines how Angular renders a single item.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. To list your items, assign the short hand `let item of items` to `*ngFor` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgFor-1" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
The string `"let item of items"` instructs Angular to do the following:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
* Store each item in the `items` array in the local `item` looping variable
* Make each item available to the templated HTML for each iteration
* Translate `"let item of items"` into an `<ng-template>` around the host element
* Repeat the `<ng-template>` for each `item` in the list
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
For more information see the [`<ng-template>` section ](guide/structural-directives#the-ng-template ) of [Structural directives ](guide/structural-directives ).
### Repeating a component view
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
To repeat a component element, apply `*ngFor` to the selector.
In the following example, the selector is `<app-item-detail>` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgFor-2" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can reference a template input variable, such as `item` , in the following locations:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
* within the `ngFor` host element
* within the host element descendants to access the item's properties
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
The following example references `item` first in an interpolation and then passes in a binding to the `item` property of the `<app-item-detail>` component.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgFor-1-2" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
For more information about template input variables, see [Structural Directives ](guide/structural-directives#template-input-variable ).
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
### Getting the `index` of `*ngFor`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can get the `index` of `*ngFor` in a template input variable and use it in the template.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
In the `*ngFor` , add a semicolon and `let i=index` to the short hand.
The following example gets the `index` in a variable named `i` and displays it with the item name.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgFor-3" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
The index property of the `NgFor` directive context returns the zero-based index of the item in each iteration.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
{@a one-per-element}
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
## Repeating elements when a condition is true
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
To repeat a block of HTML when a particular condition is true, put the `*ngIf` on a container element that wraps an `*ngFor` element.
One or both elements can be an `<ng-container>` so you don't have to introduce extra levels of HTML.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
Because structural directives add and remove nodes from the DOM, apply only one structural directive per element.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
For more information about `NgFor` see the [NgForOf API reference ](api/common/NgForOf ).
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
{@a ngfor-with-trackby}
### Tracking items with `*ngFor` `trackBy`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
By tracking changes to an item list, you can reduce the number of calls your application makes to the server.
With the `*ngFor` `trackBy` property, Angular can change and re-render only those items that have changed, rather than reloading the entire list of items.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. Add a method to the component that returns the value `NgFor` should track.
In this example, the value to track is the item's `id` .
If the browser has already rendered `id` , Angular keeps track of it and doesn't re-query the server for the same `id` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.ts" region = "trackByItems" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. In the short hand expression, set `trackBy` to the `trackByItems()` method.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "trackBy" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
**Change ids** creates new items with new `item.id` s.
In the following illustration of the `trackBy` effect, **Reset items** creates new items with the same `item.id` s.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
* With no `trackBy` , both buttons trigger complete DOM element replacement.
* With `trackBy` , only changing the `id` triggers element replacement.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/built-in-directives/ngfor-trackby.gif" alt = "Animation of trackBy" >
< / div >
2020-04-28 16:26:58 -04:00
< div class = "alert is-helpful" >
2020-11-18 08:47:53 -05:00
Built-in directives use only public APIs.
They do not have special access to any private APIs that other directives can't access.
2020-04-28 16:26:58 -04:00
< / div >
2020-11-18 08:47:53 -05:00
{@a ngcontainer}
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
## Hosting a directive without a DOM element
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
The Angular `<ng-container>` is a grouping element that doesn't interfere with styles or layout because Angular doesn't put it in the DOM.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
You can use [`<ng-container>` ](guide/structural-directives#ngcontainer ) when there's no single element to host the directive.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
Here's a conditional paragraph using `<ng-container>` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "structural-directives/src/app/app.component.html" header = "src/app/app.component.html (ngif-ngcontainer)" region = "ngif-ngcontainer" > < / code-example >
2020-04-28 16:26:58 -04:00
< div class = "lightbox" >
2020-11-18 08:47:53 -05:00
< img src = 'generated/images/guide/structural-directives/good-paragraph.png' alt = "ngcontainer paragraph with proper style" >
2020-04-28 16:26:58 -04:00
< / div >
2020-11-18 08:47:53 -05:00
1. Import the `ngModel` directive from `FormsModule` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. Add `FormsModule` to the imports section of the relevant Angular module.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. To conditionally exclude an `<option>` , wrap the `<option>` in an `<ng-container>` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "structural-directives/src/app/app.component.html" header = "src/app/app.component.html (select-ngcontainer)" region = "select-ngcontainer" > < / code-example >
< div class = "lightbox" >
< img src = 'generated/images/guide/structural-directives/select-ngcontainer-anim.gif' alt = "ngcontainer options work properly" >
< / div >
2020-04-28 16:26:58 -04:00
{@a ngSwitch}
2020-11-18 08:47:53 -05:00
## Switching cases with `NgSwitch`
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
Like the JavaScript `switch` statement, `NgSwitch` displays one element from among several possible elements, based on a switch condition.
2020-04-28 16:26:58 -04:00
Angular puts only the selected element into the DOM.
<!-- API Flagged -->
2020-11-18 08:47:53 -05:00
`NgSwitch` is a set of three directives:
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
* `NgSwitch` — an attribute directive that changes the behavior of its companion directives.
* `NgSwitchCase` — structural directive that adds its element to the DOM when its bound value equals the switch value and removes its bound value when it doesn't equal the switch value.
* `NgSwitchDefault` — structural directive that adds its element to the DOM when there is no selected `NgSwitchCase` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. On an element, such as a `<div>` , add `[ngSwitch]` bound to an expression that returns the switch value, such as `feature` .
Though the `feature` value in this example is a string, the switch value can be of any type.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. Bind to `*ngSwitchCase` and `*ngSwitchDefault` on the elements for the cases.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgSwitch" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. In the parent component, define `currentItem` so you can use it in the `[ngSwitch]` expression.
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/app.component.ts" region = "item" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
1. In each child component, add an `item` [input property ](guide/inputs-outputs#input "Input property" ) which is bound to the `currentItem` of the parent component.
The following two snippets show the parent component and one of the child components.
The other child components are identical to `StoutItemComponent` .
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< code-example path = "built-in-directives/src/app/item-switch.component.ts" region = "input" header = "In each child component, here StoutItemComponent" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-11-18 08:47:53 -05:00
< div class = "lightbox" >
< img src = "generated/images/guide/built-in-directives/ngswitch.gif" alt = "Animation of NgSwitch" >
< / div >
Switch directives also work with native HTML elements and web components.
For example, you could replace the `<app-best-item>` switch case with a `<div>` as follows.
2020-04-28 16:26:58 -04:00
< code-example path = "built-in-directives/src/app/app.component.html" region = "NgSwitch-div" header = "src/app/app.component.html" > < / code-example >
2020-11-18 08:47:53 -05:00
< hr / >
## What's next
For information on how to build your own custom directives, see [Attribute Directives ](guide/attribute-directives ) and [Structural Directives ](guide/structural-directives ).