Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Управляющие блоки @if, @for, @switch

Управляющие блоки решают, какую часть шаблона показать и сколько раз её повторить. Они начинаются со знака @ и встроены в язык шаблонов, поэтому ничего импортировать не нужно.

@if

Блок выводится, только если условие истинно:

<!-- src/app/todo-list/todo-list.html -->
@if (todos().length === 0) {
  <p>Задач пока нет.</p>
}

Пока список пуст, на странице видна надпись «Задач пока нет.». Как только появится задача, абзац исчезнет из разметки полностью.

@else и @else if

<!-- src/app/todo-list/todo-list.html -->
@if (left() === 0) {
  <p>Всё сделано!</p>
} @else if (left() === 1) {
  <p>Осталась одна задача.</p>
} @else {
  <p>Осталось задач: {{ left() }}</p>
}

Выполняется первая ветка с истинным условием, как в обычном if из JavaScript.

@for

@for повторяет блок для каждого элемента массива. Выражение track обязательно: оно говорит, по какому полю Angular узнаёт элемент.

<!-- src/app/todo-list/todo-list.html -->
<ul>
  @for (todo of todos(); track todo.id) {
    <li [class.done]="todo.done">{{ todo.title }}</li>
  }
</ul>

Для каждой задачи появится пункт списка, выполненные получат класс done. Благодаря track при добавлении задачи Angular создаёт один новый li, а не перерисовывает весь список.

@empty и служебные переменные

Блок @empty показывается, когда массив пуст. Внутри @for доступны переменные $index, $count, $first, $last, $even, $odd:

<!-- src/app/todo-list/todo-list.html -->
<ul>
  @for (todo of todos(); track todo.id) {
    <li>{{ $index + 1 }}. {{ todo.title }}</li>
  } @empty {
    <li>Задач пока нет.</li>
  }
</ul>

Задачи выводятся с номерами: «1. Купить хлеб», «2. Позвонить Олегу».

@switch

Удобен, когда нужно выбрать один вариант из нескольких по значению. Добавим в класс фильтр:

// src/app/todo-list/todo-list.ts
filter = signal<'all' | 'active' | 'done'>('all');
<!-- src/app/todo-list/todo-list.html -->
@switch (filter()) {
  @case ('active') {
    <h3>Активные задачи</h3>
  }
  @case ('done') {
    <h3>Выполненные задачи</h3>
  }
  @default {
    <h3>Все задачи</h3>
  }
}

Заголовок меняется вместе со значением сигнала filter. Блок @default срабатывает, если ни один @case не подошёл.

Старый синтаксис

До Angular 17 вместо блоков использовали директивы *ngIf, *ngFor и [ngSwitch]. Они ещё работают, но в новых проектах пишите @if, @for и @switch — их не нужно импортировать, и они быстрее.

Частая ошибка

Писать track $index для списка, который меняется: при удалении задачи из середины номера сдвигаются, и Angular перерисовывает все элементы после неё — сбрасываются введённый текст и фокус. Отслеживайте элементы по уникальному полю, например track todo.id.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.