ADR-UI-008. Управление состоянием

ADR Версия: 1.0 accepted

Состояние живёт на нескольких уровнях: локальное (компонент), страничное (несколько компонентов одной страницы), разделяемое (несколько частей приложения). Фиксируем один способ — signals + injectable-сервисы, без параллельных подходов и без глобального store.

⟨/⟩ Исходник

1. Контекст и постановка задачи

Состоянием надо управлять на трёх уровнях:

Нужен единый способ — без смеси signals / BehaviorSubject / глобального store.

2. Драйверы решения

  1. Минимум абстракций — требований к undo/time-travel/оффлайну нет; глобальный store избыточен.
  2. Явный поток данных — компонент → сервис → API; без неявных глобальных «магнитов».
  3. Нативные средства Angular — signals + computed() + toSignal() покрывают почти всё.
  4. Локальность — состояние живёт там, где используется; удаление фичи удаляет её состояние.

3. Рассмотренные варианты

4. Решение

Выбран Вариант B: signals + injectable-сервисы.

4.1. Уровни состояния

Уровень Где живёт Срок жизни
Компонентное Сигналы внутри компонента жизнь компонента
Страничное Per-page service в providers страницы (ADR-UI-013) жизнь страницы
Разделяемое @Injectable({ providedIn: 'root' }) сервис с сигналами жизнь приложения

4.2. Компонентное состояние

4.3. Страничное состояние

4.4. Разделяемое состояние

4.5. Подписки и Observable

4.6. Чего не делаем

5. Положительные следствия

6. Отрицательные следствия и компромиссы

7. Проверка

8. Открытые вопросы / отложено

Связанные артефакты

Документы