Components in Angular are like small parts of a big machine. They need to talk to each other to work together and make the app useful.
Why component communication matters in Angular
Use @Input() to receive data from a parent component. Use @Output() with EventEmitter to send data to a parent component. Use a shared service with RxJS Subjects or Signals for communication between unrelated components.
@Input() and @Output() are decorators that help components share data up and down the component tree.
Services can be used to share data across components that do not have a direct parent-child relationship.
@Input() childMessage: string;
@Output() messageEvent = new EventEmitter<string>(); sendMessage() { this.messageEvent.emit('Hello from child'); }
import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class SharedService { private messageSource = new Subject<string>(); currentMessage = this.messageSource.asObservable(); changeMessage(message: string) { this.messageSource.next(message); } }
This example shows a parent component sending a message to a child using @Input(). The child sends a message back using @Output() and an event. The parent listens and displays the child's message.
import { Component, EventEmitter, Input, Output } from '@angular/core'; @Component({ selector: 'app-child', template: ` <p>Child says: {{ childMessage }}</p> <button (click)="sendMessage()">Send Message to Parent</button> `, standalone: true }) export class ChildComponent { @Input() childMessage = ''; @Output() messageEvent = new EventEmitter<string>(); sendMessage() { this.messageEvent.emit('Hello Parent!'); } } @Component({ selector: 'app-parent', template: ` <h2>Parent Component</h2> <app-child [childMessage]="parentMessage" (messageEvent)="receiveMessage($event)"></app-child> <p>Message from child: {{ messageFromChild }}</p> `, imports: [ChildComponent], standalone: true }) export class ParentComponent { parentMessage = 'Hello Child!'; messageFromChild = ''; receiveMessage(message: string) { this.messageFromChild = message; } }
Always use @Input() and @Output() for parent-child communication to keep components clear and reusable.
For sibling or distant components, use shared services with RxJS or Angular signals to communicate.
Good communication between components helps keep your app organized and easier to maintain.
Components need to share data to work together smoothly.
Use @Input() and @Output() for parent-child data flow.
Use services for communication between unrelated components.