Encodera

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

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

Оглавление

Привязка свойств и событий

Интерполяция выводит текст, но элементам нужны и другие данные: адрес картинки, состояние кнопки, класс. Для этого есть привязка свойств — квадратные скобки. Обратное направление, от пользователя к классу, — привязка событий в круглых скобках.

Привязка свойства

Имя свойства в квадратных скобках, справа — выражение из класса:

// src/app/todo-list/todo-list.ts
import { Component } from '@angular/core';
 
@Component({
  selector: 'app-todo-list',
  templateUrl: './todo-list.html',
})
export class TodoList {
  newTitle = '';
}
<!-- src/app/todo-list/todo-list.html -->
<input placeholder="Новая задача" />
<button [disabled]="newTitle === ''">Добавить</button>

Кнопка заблокирована, пока поле newTitle пустое. Без скобок атрибут disabled="..." получил бы строку, и кнопка была бы заблокирована всегда.

Классы и стили

Отдельный класс и отдельное CSS-свойство тоже привязываются:

<!-- src/app/todo-list/todo-list.html -->
<li [class.done]="true">Купить хлеб</li>
<p [style.color]="newTitle ? 'black' : 'gray'">Подсказка</p>

Класс done добавляется, когда выражение истинно, и убирается, когда ложно.

Привязка события

Имя события в круглых скобках, справа — вызов метода:

// src/app/todo-list/todo-list.ts
export class TodoList {
  newTitle = '';
  tasks: string[] = [];
 
  add() {
    this.tasks.push(this.newTitle);
    this.newTitle = '';
  }
}
<!-- src/app/todo-list/todo-list.html -->
<button (click)="add()">Добавить</button>
<p>Всего задач: {{ tasks.length }}</p>

После каждого щелчка счётчик «Всего задач» растёт на единицу.

Объект события

Переменная $event содержит объект события браузера. Из него берут, например, текст поля:

<!-- src/app/todo-list/todo-list.html -->
<input
  placeholder="Новая задача"
  [value]="newTitle"
  (input)="newTitle = $any($event.target).value"
/>
<button [disabled]="newTitle === ''" (click)="add()">Добавить</button>

Теперь поле и класс связаны: ввод текста записывает его в newTitle, кнопка разблокируется, а после щелчка поле очищается. В обработчике событий присваивание разрешено. Функция $any отключает проверку типа, потому что TypeScript не знает, что target — это поле ввода.

Переменная шаблона

Проще получить элемент через переменную шаблона — имя с решёткой:

<!-- src/app/todo-list/todo-list.html -->
<input #field [value]="newTitle" (keyup.enter)="newTitle = field.value; add()" />

#field ссылается на сам элемент input. Событие keyup.enter срабатывает только по клавише Enter.

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

Смешивать интерполяцию и квадратные скобки нельзя: [disabled]="{{ isEmpty }}" вызовет ошибку сборки. Внутри квадратных скобок уже выражение — пишите [disabled]="isEmpty".

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

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