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). |