77 lines
3.0 KiB
Markdown
77 lines
3.0 KiB
Markdown
|
# Two-way binding `[(...)]`
|
||
|
|
||
|
Two-way binding gives your app a way to share data between a component class and
|
||
|
its template.
|
||
|
|
||
|
<div class="alert is-helpful">
|
||
|
|
||
|
See the <live-example></live-example> for a working example containing the code snippets in this guide.
|
||
|
|
||
|
</div>
|
||
|
|
||
|
## Basics of two-way binding
|
||
|
|
||
|
Two-way binding does two things:
|
||
|
|
||
|
1. Sets a specific element property.
|
||
|
1. Listens for an element change event.
|
||
|
|
||
|
Angular offers a special _two-way data binding_ syntax for this purpose, `[()]`.
|
||
|
The `[()]` syntax combines the brackets
|
||
|
of property binding, `[]`, with the parentheses of event binding, `()`.
|
||
|
|
||
|
<div class="callout is-important">
|
||
|
|
||
|
<header>
|
||
|
[( )] = banana in a box
|
||
|
</header>
|
||
|
|
||
|
Visualize a *banana in a box* to remember that the parentheses go _inside_ the brackets.
|
||
|
|
||
|
</div>
|
||
|
|
||
|
The `[()]` syntax is easy to demonstrate when the element has a settable
|
||
|
property called `x` and a corresponding event named `xChange`.
|
||
|
Here's a `SizerComponent` that fits this pattern.
|
||
|
It has a `size` value property and a companion `sizeChange` event:
|
||
|
|
||
|
<code-example path="two-way-binding/src/app/sizer/sizer.component.ts" header="src/app/sizer.component.ts"></code-example>
|
||
|
|
||
|
<code-example path="two-way-binding/src/app/sizer/sizer.component.html" header="src/app/sizer.component.html"></code-example>
|
||
|
|
||
|
The initial `size` is an input value from a property binding.
|
||
|
Clicking the buttons increases or decreases the `size`, within
|
||
|
min/max value constraints,
|
||
|
and then raises, or emits, the `sizeChange` event with the adjusted size.
|
||
|
|
||
|
Here's an example in which the `AppComponent.fontSizePx` is two-way bound to the `SizerComponent`:
|
||
|
|
||
|
<code-example path="two-way-binding/src/app/app.component.html" header="src/app/app.component.html (two-way-1)" region="two-way-1"></code-example>
|
||
|
|
||
|
The `AppComponent.fontSizePx` establishes the initial `SizerComponent.size` value.
|
||
|
|
||
|
<code-example path="two-way-binding/src/app/app.component.ts" header="src/app/app.component.ts" region="font-size"></code-example>
|
||
|
|
||
|
Clicking the buttons updates the `AppComponent.fontSizePx` via the two-way binding.
|
||
|
The revised `AppComponent.fontSizePx` value flows through to the _style_ binding,
|
||
|
making the displayed text bigger or smaller.
|
||
|
|
||
|
The two-way binding syntax is really just syntactic sugar for a _property_ binding and an _event_ binding.
|
||
|
Angular desugars the `SizerComponent` binding into this:
|
||
|
|
||
|
<code-example path="two-way-binding/src/app/app.component.html" header="src/app/app.component.html (two-way-2)" region="two-way-2"></code-example>
|
||
|
|
||
|
The `$event` variable contains the payload of the `SizerComponent.sizeChange` event.
|
||
|
Angular assigns the `$event` value to the `AppComponent.fontSizePx` when the user clicks the buttons.
|
||
|
|
||
|
## Two-way binding in forms
|
||
|
|
||
|
The two-way binding syntax is a great convenience compared to
|
||
|
separate property and event bindings. It would be convenient to
|
||
|
use two-way binding with HTML form elements like `<input>` and
|
||
|
`<select>`. However, no native HTML element follows the `x`
|
||
|
value and `xChange` event pattern.
|
||
|
|
||
|
For more on how to use two-way binding in forms, see
|
||
|
Angular [NgModel](guide/built-in-directives#ngModel).
|