2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
# Property binding
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Property binding in Angular helps you set values for properties of HTML elements or directives.
2020-11-04 14:49:29 -05:00
With property binding, you can do things such as toggle button functionality, set paths programmatically, and share values between components.
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-09-10 17:06:39 -04:00
## Prerequisites
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
To get the most out of property binding, you should be familiar with the following:
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
* [Basics of components ](guide/architecture-components )
* [Basics of templates ](guide/glossary#template )
* [Binding syntax ](guide/binding-syntax )
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< hr / >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
## Understanding the flow of data
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Property binding moves a value in one direction, from a component's property into a target element property.
< div class = "alert is-helpful" >
For more information on listening for events, see [Event binding ](guide/event-binding ).
< / div >
To read a target element property or call one of its methods, see the API reference for [ViewChild ](api/core/ViewChild ) and [ContentChild ](api/core/ContentChild ).
## Binding to a property
To bind to an element's property, enclose it in square brackets, `[]` , which identifies the property as a target property.
A target property is the DOM property to which you want to assign a value.
For example, the target property in the following code is the image element's `src` property.
2020-04-28 16:26:58 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "property-binding" header = "src/app/app.component.html" > < / code-example >
2020-09-10 17:06:39 -04:00
In most cases, the target name is the name of a property, even when it appears to be the name of an attribute.
In this example, `src` is the name of the `<img>` element property.
The brackets, `[]` , cause Angular to evaluate the right-hand side of the assignment as a dynamic expression.
Without the brackets, Angular treats the the right-hand side as a string literal and sets the property to that static value.
< code-example path = "property-binding/src/app/app.component.html" region = "no-evaluation" header = "src/app.component.html" > < / code-example >
Omitting the brackets renders the string `parentItem` , not the value of `parentItem` .
## Setting an element property to a component property value
To bind the `src` property of an `<img>` element to a component's property, place the target, `src` , in square brackets followed by an equal sign and then the property.
The property here is `itemImageUrl` .
< code-example path = "property-binding/src/app/app.component.html" region = "property-binding" header = "src/app/app.component.html" > < / code-example >
Declare the `itemImageUrl` property in the class, in this case `AppComponent` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.ts" region = "item-image" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-14 17:12:32 -04:00
{@a colspan}
#### `colspan` and `colSpan`
A common point of confusion is between the attribute, `colspan` , and the property, `colSpan` .
Notice that these two names differ by only a single letter.
If you wrote something like this:
< code-example language = "html" >
< tr> < td colspan="{{1 + 1}}"> Three-Four< /td> < /tr>
< / code-example >
You'd get this error:
< code-example language = "bash" >
Template parse errors:
Can't bind to 'colspan' since it isn't a known native property
< / code-example >
As the message says, the `<td>` element does not have a `colspan` property. This is true
because `colspan` is an attribute— `colSpan`, with a capital `S` , is the
corresponding property. Interpolation and property binding can set only *properties* , not attributes.
Instead, you'd use property binding and write it like this:
< code-example path = "attribute-binding/src/app/app.component.html" region = "colSpan" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
Another example is disabling a button when the component says that it `isUnchanged` :
< code-example path = "property-binding/src/app/app.component.html" region = "disabled-button" header = "src/app/app.component.html" > < / code-example >
Another is setting a property of a directive:
< code-example path = "property-binding/src/app/app.component.html" region = "class-binding" header = "src/app/app.component.html" > < / code-example >
Yet another is setting the model property of a custom component— a great way
for parent and child components to communicate:
< code-example path = "property-binding/src/app/app.component.html" region = "model-property-binding" header = "src/app/app.component.html" > < / code-example >
2020-09-10 17:06:39 -04:00
## Toggling button functionality
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
To disable a button's functionality depending on a Boolean value, bind the DOM `disabled` property to a property in the class that is `true` or `false` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "disabled-button" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Because the value of the property `isUnchanged` is `true` in the `AppComponent` , Angular disables the button.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.ts" region = "boolean" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
## Setting a directive property
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
To set a property of a directive, place the directive within square brackets , such as `[ngClass]` , followed by an equal sign and the property.
Here, the property is `classes` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "class-binding" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
To use the property, you must declare it in the class, which in this example is `AppComponent` .
The value of `classes` is `special` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.ts" region = "directive-property" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Angular applies the class `special` to the `<p>` element so that you can use `special` to apply CSS styles.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
## Bind values between components
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
To set the model property of a custom component, place the target, here `childItem` , between square brackets `[]` followed by an equal sign and the property.
Here, the property is `parentItem` .
2020-04-28 16:26:58 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "model-property-binding" header = "src/app/app.component.html" > < / code-example >
2020-09-10 17:06:39 -04:00
To use the target and the property, you must declare them in their respective classes.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Declare the target of `childItem` in its component class, in this case `ItemDetailComponent` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
For example, the following code declares the target of `childItem` in its component class, in this case `ItemDetailComponent` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Then, the code contains an `@Input()` decorator with the `childItem` property so data can flow into it.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/item-detail/item-detail.component.ts" region = "input-type" header = "src/app/item-detail/item-detail.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Next, the code declares the property of `parentItem` in its component class, in this case `AppComponent` .
In this example the type of `childItem` is `string` , so `parentItem` needs to be a string.
Here, `parentItem` has the string value of `lamp` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.ts" region = "parent-data-type" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
With this configuration, the view of `<app-item-detail>` uses the value of `lamp` for `childItem` .
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
## Property binding and security
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Property binding can help keep content secure.
For example, consider the following malicious content.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.ts" region = "malicious-content" header = "src/app/app.component.ts" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
The component template interpolates the content as follows:
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "malicious-interpolated" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
The browser doesn't process the HTML and instead displays it raw, as follows.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example language = "bash" >
"Template < script> alert("evil never sleeps")< /script> Syntax" is the interpolated evil title.
< / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Angular does not allow HTML with `<script>` tags, neither with [interpolation ](guide/interpolation ) nor property binding, which prevents the JavaScript from running.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
In the following example, however, Angular [sanitizes ](guide/security#sanitization-and-security-contexts ) the values before displaying them.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "malicious-content" header = "src/app/app.component.html" > < / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Interpolation handles the `<script>` tags differently than property binding, but both approaches render the content harmlessly.
The following is the browser output of the sanitized `evilTitle` example.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< code-example language = "bash" >
"Template Syntax" is the property bound evil title.
< / code-example >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
## Property binding and interpolation
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
Often [interpolation ](guide/interpolation ) and property binding can achieve the same results.
The following binding pairs do the same thing.
2020-04-28 16:26:58 -04:00
< code-example path = "property-binding/src/app/app.component.html" region = "property-binding-interpolation" header = "src/app/app.component.html" > < / code-example >
2020-09-10 17:06:39 -04:00
You can use either form when rendering data values as strings, though interpolation is preferable for readability.
However, when setting an element property to a non-string data value, you must use property binding.
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
< hr / >
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
## What's next
2020-04-28 16:26:58 -04:00
2020-09-10 17:06:39 -04:00
* [Property binding best practices ](guide/property-binding-best-practices )