109 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # Event binding `(event)`
 | ||
|  | 
 | ||
|  | Event binding allows you to listen for certain events such as | ||
|  | keystrokes, mouse movements, clicks, and touches. | ||
|  | 
 | ||
|  | <div class="alert is-helpful"> | ||
|  | 
 | ||
|  | See the <live-example></live-example> for a working example containing the code snippets in this guide. | ||
|  | 
 | ||
|  | </div> | ||
|  | 
 | ||
|  | Angular event binding syntax consists of a **target event** name | ||
|  | within parentheses on the left of an equal sign, and a quoted | ||
|  | template statement on the right. | ||
|  | The following event binding listens for the button's click events, calling | ||
|  | the component's `onSave()` method whenever a click occurs: | ||
|  | 
 | ||
|  | <div class="lightbox"> | ||
|  |   <img src='generated/images/guide/template-syntax/syntax-diagram.svg' alt="Syntax diagram"> | ||
|  | </div> | ||
|  | 
 | ||
|  | ## Target event
 | ||
|  | 
 | ||
|  | As above, the target is the button's click event. | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/app.component.html" region="event-binding-1" header="src/app/app.component.html"></code-example> | ||
|  | 
 | ||
|  | Alternatively, use the `on-` prefix, known as the canonical form: | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/app.component.html" region="event-binding-2" header="src/app/app.component.html"></code-example> | ||
|  | 
 | ||
|  | Element events may be the more common targets, but Angular looks first to see if the name matches an event property | ||
|  | of a known directive, as it does in the following example: | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/app.component.html" region="custom-directive" header="src/app/app.component.html"></code-example> | ||
|  | 
 | ||
|  | If the name fails to match an element event or an output property of a known directive, | ||
|  | Angular reports an “unknown directive” error. | ||
|  | 
 | ||
|  | ## *$event* and event handling statements
 | ||
|  | 
 | ||
|  | In an event binding, Angular sets up an event handler for the target event. | ||
|  | 
 | ||
|  | When the event is raised, the handler executes the template statement. | ||
|  | The template statement typically involves a receiver, which performs an action | ||
|  | in response to the event, such as storing a value from the HTML control | ||
|  | into a model. | ||
|  | 
 | ||
|  | The binding conveys information about the event. This information can include data values such as an event object, string, or number named `$event`. | ||
|  | 
 | ||
|  | The target event determines the shape of the `$event` object. | ||
|  | If the target event is a native DOM element event, then `$event` is a | ||
|  | [DOM event object](https://developer.mozilla.org/en-US/docs/Web/Events), | ||
|  | with properties such as `target` and `target.value`. | ||
|  | 
 | ||
|  | Consider this example: | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/app.component.html" region="event-binding-3" header="src/app/app.component.html"></code-example> | ||
|  | 
 | ||
|  | This code sets the `<input>` `value` property by binding to the `name` property. | ||
|  | To listen for changes to the value, the code binds to the `input` | ||
|  | event of the `<input>` element. | ||
|  | When the user makes changes, the `input` event is raised, and the binding executes | ||
|  | the statement within a context that includes the DOM event object, `$event`. | ||
|  | 
 | ||
|  | To update the `name` property, the changed text is retrieved by following the path `$event.target.value`. | ||
|  | 
 | ||
|  | If the event belongs to a directive—recall that components | ||
|  | are directives—`$event` has whatever shape the directive produces. | ||
|  | 
 | ||
|  | ## Custom events with `EventEmitter`
 | ||
|  | 
 | ||
|  | Directives typically raise custom events with an Angular [EventEmitter](api/core/EventEmitter). | ||
|  | The directive creates an `EventEmitter` and exposes it as a property. | ||
|  | The directive calls `EventEmitter.emit(payload)` to fire an event, passing in a message payload, which can be anything. | ||
|  | Parent directives listen for the event by binding to this property and accessing the payload through the `$event` object. | ||
|  | 
 | ||
|  | Consider an `ItemDetailComponent` that presents item information and responds to user actions. | ||
|  | Although the `ItemDetailComponent` has a delete button, it doesn't know how to delete the hero. It can only raise an event reporting the user's delete request. | ||
|  | 
 | ||
|  | Here are the pertinent excerpts from that `ItemDetailComponent`: | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/item-detail/item-detail.component.html" header="src/app/item-detail/item-detail.component.html (template)" region="line-through"></code-example> | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/item-detail/item-detail.component.ts" header="src/app/item-detail/item-detail.component.ts (deleteRequest)" region="deleteRequest"></code-example> | ||
|  | 
 | ||
|  | The component defines a `deleteRequest` property that returns an `EventEmitter`. | ||
|  | When the user clicks *delete*, the component invokes the `delete()` method, | ||
|  | telling the `EventEmitter` to emit an `Item` object. | ||
|  | 
 | ||
|  | Now imagine a hosting parent component that binds to the `deleteRequest` event | ||
|  | of the `ItemDetailComponent`. | ||
|  | 
 | ||
|  | <code-example path="event-binding/src/app/app.component.html" header="src/app/app.component.html (event-binding-to-component)" region="event-binding-to-component"></code-example> | ||
|  | 
 | ||
|  | When the `deleteRequest` event fires, Angular calls the parent component's | ||
|  | `deleteItem()` method, passing the *item-to-delete* (emitted by `ItemDetail`) | ||
|  | in the `$event` variable. | ||
|  | 
 | ||
|  | ## Template statements have side effects
 | ||
|  | 
 | ||
|  | Though [template expressions](guide/interpolation#template-expressions) shouldn't have [side effects](guide/property-binding#avoid-side-effects), template | ||
|  | statements usually do. The `deleteItem()` method does have | ||
|  | a side effect: it deletes an item. | ||
|  | 
 | ||
|  | Deleting an item updates the model, and depending on your code, triggers | ||
|  | other changes including queries and saving to a remote server. | ||
|  | These changes propagate through the system and ultimately display in this and other views. |