Проверяет понимание способов передачи данных между компонентами в Angular: входные свойства, двустороннее связывание и сигналы.
В Angular компоненты общаются через иерархию: родитель передает данные вниз через @Input(), а дочерний сообщает о событиях через @Output() с EventEmitter. Это однонаправленный поток данных, который упрощает отладку и предсказуемость.
Для двустороннего связывания используется синтаксис [(ngModel)] (в формах) или комбинация [value] и (valueChange). Однако с появлением сигналов в Angular 16+ появился более чистый способ: сигналы позволяют создавать реактивные значения, которые автоматически обновляют представление.
// child.component.ts
@Component({...})
export class ChildComponent {
@Input() count = 0;
@Output() countChange = new EventEmitter<number>();
increment() {
this.count++;
this.countChange.emit(this.count);
}
}
// parent.component.html
<app-child [count]="parentCount" (countChange)="parentCount = $event"></app-child>Синтаксис [(ngModel)] — это сахар над [ngModel] и (ngModelChange). Он удобен для форм, но для произвольных компонентов лучше явно использовать Input/Output.
Сигналы — это реактивные примитивы, которые отслеживают зависимости и обновляют только те части шаблона, которые зависят от измененного сигнала. Пример:
// counter.component.ts
import { signal, computed } from '@angular/core';
@Component({...})
export class CounterComponent {
count = signal(0);
double = computed(() => this.count() * 2);
increment() {
this.count.update(c => c + 1);
}
}В шаблоне сигналы вызываются как функции: {{ count() }}. Это позволяет избежать zone.js и улучшает производительность.
Для простых случаев используйте @Input()/@Output(). Для форм — [(ngModel)]. Для сложных реактивных состояний и оптимизации — сигналы. Сигналы становятся стандартом в новых версиях Angular, поэтому их стоит изучать и применять в новых проектах.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию