@input, @output & EventEmitter In Angular
In this article, we will learn how to use @input, @output, and EventEmitter in Angular. These decorators are used to send data from the parent component to the child component and vice versa. @Input specifies the component's input property, which can be changed by the parent component. The @output specifies the output property (event), which is raised by the EventEmitter in the child component. These occurrences are relayed to the parent.
@input, @output & Eventemitter
@input
The input decorator transforms a property into an input property. That is, it is capable of receiving data from the parent component. Property binding is used by the parent component to connect it to a component property. Angular updates the value in the child component whenever the value in the parent component changes.
Example
Consider the component class below:
@Component({
selector: 'app-customer-detail',
templateUrl: './customer-detail.component.html',
styleUrls: ['./customer-detail.component.css']
})
export class CustomerDetailComponent implements OnInit {
@Input() customer:Customer;
}
<app-customer-detail customer="" selectedcustomer=""></app-customer-detail>
@output
Example
//Declare the property
@Output() customerChange:EventEmitter<customer> =new EventEmitter<customer>();
//Raise the event to send the data back to parent
update() {
this.customerChange.emit(this.customer);
}
<app-customer-detail customer="" customerchange="" event="" selectedcustomer="" update=""></app-customer-detail>
EventEmitter
//Define output property
@Output() customerChange:EventEmitter<customer> =new EventEmitter<customer>();
//Raise the event using the emit method.
update() {
this.customerChange.emit(this.customer);
}
@input, @output & Eventemitter Example
ng new InputOutputExample cd InputOutputExample
Create the components customerList and customerDetail. Create a customer class as well.
ng g c customerList ng g c customerDetail ng g class customer
Create customer class.
export class Customer {
customerNo: number=0;
name: string="";
address: string="";
city: string="";
state: string="";
country: string="";
}
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { CustomerListComponent } from './customer-list/customer-list.component';
import { CustomerDetailComponent } from './customer-detail/customer-detail.component';
@NgModule({
declarations: [
AppComponent,
CustomerListComponent,
CustomerDetailComponent
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule
],
providers: [],
bootstrap: [AppComponent],
})
export class AppModule { }
Child Component
import { Component, OnInit, Input, Output,EventEmitter } from '@angular/core';
import { Customer } from '../customer';
@Component({
selector: 'app-customer-detail',
templateUrl: './customer-detail.component.html',
styleUrls: ['./customer-detail.component.css']
})
export class CustomerDetailComponent implements OnInit {
@Input() customer:Customer = new Customer();
@Output() customerChange:EventEmitter<customer> =new EventEmitter<customer>();
constructor() { }
ngOnInit() {
}
update() {
this.customerChange.emit(this.customer);
}
}
@Input() customer:Customer = new Customer();
customerChange is an output property of the EventEmitter type.
@Output() customerChange:EventEmitter<customer> =new EventEmitter<customer>();
We raise the event customerChange whenever the user changes the customer. We provide it the updated customer as an argument.
update() {
this.customerChange.emit(this.customer);
}
The following code is the customer-detail.component.html file.
<p>Customer No : {{customer.customerNo}}</p>
<p>Name : <input customer.name="" ngmodel="" /></p>
<p>Address : <input customer.address="" ngmodel="" /></p>
<p>city : <input customer.city="" ngmodel="" /></p>
<p>state : <input customer.state="" ngmodel="" /></p>
<p>country : <input customer.country="" ngmodel="" /></p>
<button click="" update="">Update</button>
Parent Component
<h2>List of Customers</h2>
<table class="table">
<thead>
<tr>
<th>No</th>
<th>Name</th>
<th>Address</th>
<th>City</th>
<th>State</th>
<th>Country</th>
<th>Edit</th>
</tr>
</thead>
<tbody>
<tr ngfor="let customer of customers;">
<td>{{customer.customerNo}}</td>
<td>{{customer.name}}</td>
<td>{{customer.address}}</td>
<td>{{customer.city}}</td>
<td>{{customer.state}}</td>
<td>{{customer.country}}</td>
<td><button click="" customer="" showdetails="">Edit</button></td>
</tr>
</tbody>
</table>
<h3>Details</h3>
<app-customer-detail customer="" customerchange="" event="" selectedcustomer="" update=""></app-customer-detail>
<button click="" customer="" showdetails="">Edit</button>
import { Component, OnInit } from '@angular/core';
import { Customer } from '../customer';
import { element } from 'protractor';
import { ObjectUnsubscribedError } from 'rxjs';
@Component({
selector: 'app-customer-list',
templateUrl: './customer-list.component.html',
styleUrls: ['./customer-list.component.css']
})
export class CustomerListComponent implements OnInit {
customers: Customer[] = [
{customerNo: 1, name: 'Rahuld Dravid', address: '', city: 'Banglaore', state: 'Karnataka', country: 'India'},
{customerNo: 2, name: 'Sachin Tendulkar', address: '', city: 'Mumbai', state: 'Maharastra', country: 'India'},
{customerNo: 3, name: 'Saurrav Ganguly', address: '', city: 'Kolkata', state: 'West Bengal', country: 'India'},
{customerNo: 4, name: 'Mahendra Singh Dhoni', address: '', city: 'Ranchi', state: 'Bihar', country: 'India'},
{customerNo: 5, name: 'Virat Kohli', address: '', city: 'Delhi', state: 'Delhi', country: 'India'},
]
selectedCustomer:Customer = new Customer();
constructor() { }
ngOnInit() {
}
showDetails(customer:Customer) {
this.selectedCustomer=Object.assign({},customer)
}
update(customer:Customer) {
console.log(customer)
var cust=this.customers.find(e => e.customerNo==customer.customerNo)
Object.assign(cust,customer)
alert("Customer Saved")
}
}
<app-customer-list></app-customer-list>
Notes on @Input & @Output
@Input(‘customerData’) customer:Customer;
Intercept input property changes with a setter
private _customerData = '';
@Input()
set customer(customer: Customer) {
//You can add some custom logic here
this._customerData = customer;
console.log(this._customerData)
}
get customer(): string { return this._customerData; }
