Что такое сигналы (Signals) в Angular?
Signals и RxJS
Signal — реактивная обёртка над значением, которая уведомляет потребителей об изменении. Angular использует сигналы для точечного обновления интерфейса без лишних проверок всего дерева.
Основные примитивы
import { signal, computed, effect } from '@angular/core';
const count = signal(0); // записываемый сигнал
const double = computed(() => count() * 2); // производное значение
count.set(5);
count.update(v => v + 1); // 6
console.log(double()); // 12
effect(() => console.log('count =', count())); // только в injection context (конструктор/поле компонента или сервиса)signal()— читается вызовомcount(), пишетсяsetиupdate.computed()— вычисляется лениво и кешируется, пересчитывается только при изменении зависимостей.effect()— побочный эффект, который запускается при изменении прочитанных сигналов.
В компонентах
@Component({
template: `<button (click)="inc()">{{ count() }}</button>`,
})
export class CounterComponent {
count = signal(0);
inc() { this.count.update(v => v + 1); }
}Шаблон автоматически узнаёт, что зависит от сигнала, и обновляет только эту часть.
Сигнальные API компонентов
input(), output(), model(), viewChild(), contentChild() — сигнальные аналоги декораторов @Input, @Output, @ViewChild.
Что дают сигналы
- Точечное обновление вместо проверки всего дерева (основа zoneless-режима).
- Простая модель: значение читается и обновляется явно, без подписок и отписок.
- Автоматическое отслеживание зависимостей в
computedиeffect.
Сигналы и RxJS
Сигналы хороши для синхронного состояния интерфейса, RxJS — для потоков событий во времени (запросы, дебаунс, комбинирование). Они совместимы: toSignal(observable$) и toObservable(signal).
Коротко для собеседования
Signal хранит значение и уведомляет зависимых: signal для состояния, computed для производных значений, effect для побочных действий. Позволяют Angular обновлять только изменившиеся части шаблона и работают рядом с RxJS.