@Input() @Output() for Child and Parent Component Communication
This example shows how @Input, @Output decorations work. To make is simple to read, this example is actually doing something not so particle in the real world…
Create a parent and child component
In console, type:
>>ng g c parent CREATE src/app/parent/parent.component.html (25 bytes) CREATE src/app/parent/parent.component.spec.ts (628 bytes) CREATE src/app/parent/parent.component.ts (269 bytes) CREATE src/app/parent/parent.component.css (0 bytes) UPDATE src/app/app.module.ts (680 bytes) >>ng g c child CREATE src/app/child/child.component.html (24 bytes) CREATE src/app/child/child.component.spec.ts (621 bytes) CREATE src/app/child/child.component.ts (265 bytes) CREATE src/app/child/child.component.css (0 bytes) UPDATE src/app/app.module.ts (758 bytes)
Parent Component
parent.component.ts
Here we create two variable that will be passed to the child component, and a function onChildButtonClicked() function that will be called when the child's button is clicked.
import {Component, OnInit} from '@angular/core';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {
iChildButtonClickedTime: number = 0;
myString: string = "myString";
myNumber: number = 1000;
constructor() {
}
ngOnInit() {
}
onChildButtonCLicked($event: number) {
this.iChildButtonClickedTime = $event
}
}
parent.component.html
The import part here is we bind myString, and myNumber to <app-child> component, and bind an emitter from the child to our onChildButtonClicked() function.
<p><app-child
[inputString]="myString"
[inputNumber]="myNumber"
(toParentEmitter)="onChildButtonCLicked($event)"
>
</app-child></p>
<p>Child component clicked times: {{iChildButtonClickedTime}}</p>
Child Component
child.component.ts
Here, we see the @Input and @Output decorations, which mapped in parent's html file. So, when this child component is created, the @Input values have already been set. Likewise, the output emitted is also be bind on create.
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {
iNumOfClick: number = 0;
@Input() inputString: string;
@Input() inputNumber: number;
@Output() toParentEmitter = new EventEmitter<number>();
constructor() {
}
ngOnInit() {
}
onButtonClicked() {
this.iNumOfClick++;
this.toParentEmitter.emit(this.iNumOfClick);
}
}
child.component.html
<p> The number pass from parent is {{inputNumber}}</p>
<p> The string pass from parent is {{inputString}}</p>
<button (click)="onButtonClicked()">Click</button>