Understanding @Input() and @Output() Decorators in Angular
Question 1: What are @Input() and @Output() decorators and what’s their purpose?
Answer: @Input() and @Output() are decorators in Angular that facilitate component communication:
- @Input() allows a parent component to pass data to a child component
- @Output() enables a child component to send data back to the parent through event emission
Question 2: How do you implement @Input() in Angular 17+?
Answer: Here’s a modern implementation using Angular 17+ features:
// child.component.ts
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<div>
<h3>Welcome {{ username }}!</h3>
<p>Role: {{ userRole() }}</p>
</div>
`
})
export class ChildComponent {
// Basic input
@Input() username: string = '';
// Input with Signal (Angular 17+)
@Input({ required: true }) userRole!: () => string;
// Input with transform function
@Input({ transform: (value: string) => value.toUpperCase() })
title: string = '';
}
// parent.component.ts
@Component({
selector: 'app-parent',
template: `
<app-child
[username]="user.name"
[userRole]="roleSignal"
[title]="'developer'"
></app-child>
`
})
export class ParentComponent {
user = { name: 'John Doe' };
roleSignal = signal('Admin');
}
Question 3: How do you implement @Output() with EventEmitter?
Answer: Here’s a practical example:
// child.component.ts
import { Component, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<div>
<button (click)="onUserAction()">Perform Action</button>
<button (click)="onStatusChange('active')">Set Active</button>
</div>
`
})
export class ChildComponent {
@Output() userAction = new EventEmitter<void>();
@Output() statusChange = new EventEmitter<string>();
onUserAction() {
this.userAction.emit();
}
onStatusChange(status: string) {
this.statusChange.emit(status);
}
}
// parent.component.ts
@Component({
selector: 'app-parent',
template: `
<app-child
(userAction)="handleUserAction()"
(statusChange)="handleStatusChange($event)"
></app-child>
`
})
export class ParentComponent {
handleUserAction() {
console.log('User action received from child');
}
handleStatusChange(status: string) {
console.log(`Status changed to: ${status}`);
}
}
Question 4: What are the best practices for using @Input() and @Output()?
Answer:
- Use required inputs when the component cannot function without them:
@Input({ required: true }) data!: DataType;
- Provide default values for optional inputs:
@Input() theme: 'light' | 'dark' = 'light';
- Use transform functions for input preprocessing:
@Input({ transform: (value: number) => Math.max(0, value) })
count: number = 0;
- Name outputs with specific event names:
@Output() statusChange = new EventEmitter<string>(); // Good
@Output() myEvent = new EventEmitter<void>(); // Too generic
Interview Tips 💡
Understanding Decorators
- Be ready to explain that decorators are a TypeScript feature used by Angular for metadata
- Know that @Input() and @Output() are from @angular/core
Data Flow
- Explain that @Input() represents downward data flow (parent → child)
- @Output() represents upward data flow (child → parent)
- This follows Angular’s unidirectional data flow principle
Advanced Features
- Mention Angular 17’s required inputs feature
- Discuss transform functions for input preprocessing
- Know about signal inputs and their benefits
Common Pitfalls
- Be aware that @Input() properties are undefined during construction
- Understand that EventEmitter extends RxJS Subject
- Know when to use ngOnChanges for input changes
Real-World Scenarios
- Be prepared to discuss component communication patterns
- Know how to handle complex data structures
- Understand when to use services vs @Input()/@Output()
Performance Considerations
- Discuss OnPush change detection strategy
- Know how to optimize event emission
- Understand the impact of excessive property bindings
Remember: In interviews, focus on demonstrating not just how to use these decorators, but also why and when to use them. Show understanding of Angular’s component architecture and data flow patterns.
Test Your Knowledge
Take a quick quiz to test your understanding of this topic.