Пустые состояния (Empty States) — это незаметные, но критически важные элементы интерфейса. Что видит пользователь, когда список задач пуст, поиск не дал результатов или дашборд ещё не содержит данных? Пу��той экран? Бесполезный спиннер? Или продуманное сообщение, которое помогает сориентироваться?
С появлением декларативного управления потоками (declarative control flow) в Angular обработка пустых состояний стала проще и элегантнее. Одна из ключевых возможностей — директива @empty, которая делает код чище, а интерфейс — дружелюбнее.
Давайте разберёмся, как это работает.
1. Почему пустым состояниям нужно больше внимания
Приложения часто работают с пустыми данными:
Нет задач в списке дел.
Поиск не дал результатов.
Нет уведомлений (хорошая новость, но пользователь должен это понять).
Плохо оформленное пустое состояние — это плохой UX.
Грамотная обработка таких сценариев помогает:
✅ Информировать пользователя (например, "Здесь пока ничего нет").
✅ Снижать тревожность (пустой экран может выглядеть как ошибка).
✅ Подсказывать действия ("Добавить первую задачу", "Изменить фильтры").
Как это делали раньше?
В ранних версиях Angular использовали *ngIf или дублировали разметку:
<ul> <li *ngFor="let item of items">{{ item }}</li> </ul> <div *ngIf="!items.length">Нет элементов.</div>
Это работало, но:
❌ Логика размазана по шаблону.
❌ Дублирование кода усложняет поддержку.
❌ Меньше выразительности — намерение разработчика неочевидно.
2. Директива @empty в Angular
С версии Angular 17+ появился новый декларативный синтаксис (@for, @if, @switch), включая @empty. Теперь обработка пустых состояний стала частью шаблонной логики.
Сравним старый и новый подход
🔹 Старый способ (до @empty)
<ul> <li *ngFor="let item of items">{{ item }}</li> </ul> <div *ngIf="items.length === 0">Нет элементов.</div>
🔹 Современный способ (с @empty)
<ul> @for (item of items; track item.id) { <li>{{ item.name }}</li> } @empty { <li>Элементы не найдены.</li> } </ul>
Почему это лучше?
✔ Код читаемее — логика списка и пустого состояния в одном месте.
✔ Меньше дублирования — не нужно отдельно проверять длину массива.
✔ Гибкость — внутри @empty можно использовать любую разметку.
3. Практические примеры
🔸 Пример: Поиск с @empty
<ul> @for (result of searchResults; track result.id) { <li> <strong>{{ result.title }}</strong> <span>{{ result.snippet }}</span> </li> } @empty { <li class="empty-state"> <mat-icon>search_off</mat-icon> <p>Ничего не найдено. Попробуйте изменить запрос.</p> </li> } </ul>
🔸 Переиспользуемый компонент для пустых состояний
Вместо текста можно использовать готовый компонент:
@empty { <app-empty-state icon="inbox" title="Нет данных" description="Попробуйте обновить страницу или изменить фильтры." /> }
Преимущества:
Единый стиль во всём приложении.
Меньше кода — не дублируем разметку.
4. Важные нюансы @empty
Должен идти после
@for— иначе будет ошибка компиляции.Срабатывает только на пустой массив (
[]) (но можно добавить проверку наnull/undefined).Поддерживает любую вложенную разметку — изображения, кнопки, стилизованные блоки.
5. Оптимизация UX через пустые состояния
Пустые экраны — не просто заглушки, а часть взаимодействия. Хороший empty state может:
Объяснять, почему данных нет.
Предлагать действия ("Создать задачу", "Обновить страницу").
Улучшать восприятие (например, через анимации или иллюстрации).
Рекомендации:
Не игнорируйте empty states — они влияют на UX.
Используйте компоненты для единообразия.
Тестируйте — отсутствие данных не должно выглядеть как ошибка.
Заключение
@empty в Angular — это не просто синтаксический сахар, а удобный и выразительный способ работы с пустыми состояниями.
Что это даёт?
Чище код — логика в одном месте.
Лучше UX — пользователь всегда видит осмысленный интерфейс.
Проще поддержка — меньше дублирования и ошибок.
Совет: Начните использовать @empty в новых проектах — это сделает ваши шаблоны лаконичнее, а интерфейсы — дружелюбнее.
