@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>