Пайпы¶
30.09.2026
Обзор¶
Пайпы — особые операторы в выражениях шаблона Angular: они декларативно преобразуют данные прямо в шаблоне. Функцию преобразования объявляют один раз и затем используют в разных шаблонах. Пайпы Angular записывают вертикальной чертой (|) — по аналогии с конвейером Unix.
Синтаксис пайпов Angular отличается от обычного JavaScript, где вертикальная черта означает оператор побитового ИЛИ. Выражения шаблона Angular не поддерживают побитовые операторы.
Пример с несколькими встроенными пайпами Angular:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
При отрисовке компонента Angular подбирает формат даты и валюты по локали пользователя. Для пользователя из США получится так:
1 2 3 4 | |
Подробнее о том, как Angular локализует значения, — в подробном руководстве по интернационализации.
Встроенные пайпы¶
В пакете @angular/common есть набор встроенных пайпов:
| Имя | Описание |
|---|---|
AsyncPipe | Читает значение из Promise или RxJS Observable. |
CurrencyPipe | Преобразует число в строку валюты по правилам локали. |
DatePipe | Форматирует значение Date по правилам локали. |
DecimalPipe | Преобразует число в строку с десятичной точкой по правилам локали. |
I18nPluralPipe | Сопоставляет значение со строкой, которая ставит его во множественное число по правилам локали. |
I18nSelectPipe | Сопоставляет ключ с пользовательским селектором, который возвращает нужное значение. |
JsonPipe | Преобразует объект в строку через JSON.stringify, предназначен для отладки. |
KeyValuePipe | Преобразует Object или Map в массив пар «ключ — значение». |
LowerCasePipe | Переводит текст в нижний регистр. |
PercentPipe | Преобразует число в строку процентов по правилам локали. |
SlicePipe | Создаёт новый Array или String с подмножеством (срезом) элементов. |
TitleCasePipe | Переводит текст в регистр заголовка. |
UpperCasePipe | Переводит текст в верхний регистр. |
Использование пайпов¶
Оператор пайпа Angular — вертикальная черта (|) внутри выражения шаблона. Это бинарный оператор: левый операнд — значение, которое передаётся функции преобразования, правый — имя пайпа и дополнительные аргументы (о них ниже).
1 | |
В этом примере значение amount передаётся в CurrencyPipe, имя пайпа — currency. Затем отрисовывается валюта по умолчанию для локали пользователя.
Несколько пайпов в одном выражении¶
К одному значению можно применить несколько преобразований, поставив несколько операторов пайпа. Angular выполняет пайпы слева направо.
В примере ниже пайпы вместе показывают локализованную дату в верхнем регистре:
1 | |
Передача параметров пайпам¶
Некоторые пайпы принимают параметры, которые настраивают преобразование. Параметр указывают после имени пайпа через двоеточие (:) и значение параметра.
Например, DatePipe принимает параметры, чтобы отформатировать дату определённым образом.
1 | |
Некоторые пайпы принимают несколько параметров. Дополнительные значения разделяют двоеточием (:).
Например, вторым необязательным параметром можно задать часовой пояс.
1 | |
Как работают пайпы¶
По сути пайпы — функции: они принимают входное значение и возвращают преобразованное.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
В этом примере:
CurrencyPipeимпортируется из@angular/commonCurrencyPipeдобавляется в массивimports- Данные
amountпередаются пайпуcurrency
Приоритет оператора пайпа¶
Приоритет оператора пайпа ниже, чем у других бинарных операторов, включая +, -, *, /, %, &&, || и ??.
1 2 | |
Приоритет оператора пайпа выше, чем у условного (тернарного) оператора.
1 | |
Если то же выражение записать без скобок:
1 | |
Оно будет разобрано так:
1 | |
Если приоритет операторов может быть неоднозначным, ставьте в выражениях скобки.
Обнаружение изменений и пайпы¶
По умолчанию все пайпы считаются pure: они выполняются только когда меняется примитивное входное значение (например, String, Number, Boolean или Symbol) или ссылка на объект (например, Array, Object, Function или Date). Чистые пайпы выгодны по производительности: Angular не вызывает функцию преобразования, если переданное значение не изменилось.
Поэтому мутации свойств объекта или элементов массива не обнаруживаются, пока всю ссылку на объект или массив не заменят другим экземпляром. Если нужно обнаружение изменений такого уровня, смотрите обнаружение изменений внутри массивов и объектов.
Создание собственных пайпов¶
Собственный пайп задают классом TypeScript с декоратором @Pipe. У пайпа должно быть две вещи:
- Имя, указанное в декораторе пайпа
- Метод с именем
transform, который выполняет преобразование значения.
Класс TypeScript дополнительно должен реализовать интерфейс PipeTransform, чтобы удовлетворять сигнатуре типа пайпа.
Пример собственного пайпа, который переводит строки в kebab-case:
kebab-case.pipe.ts
1 2 3 4 5 6 7 8 9 10 | |
Декоратор @Pipe¶
При создании собственного пайпа импортируйте Pipe из пакета @angular/core и повесьте его декоратором на класс TypeScript.
1 2 3 4 5 6 | |
Декоратору @Pipe нужен name: он задаёт, как пайп используется в шаблоне.
Соглашение об именах собственных пайпов¶
Соглашение об именах собственных пайпов состоит из двух правил:
name— рекомендуется camelCase. Дефисы не используйте.class name— вариантnameв PascalCase с суффиксомPipeв конце
Реализация интерфейса PipeTransform¶
Помимо декоратора @Pipe, собственные пайпы всегда должны реализовать интерфейс PipeTransform из @angular/core.
1 2 3 4 5 6 | |
Реализация этого интерфейса гарантирует, что у класса пайпа правильная структура.
Преобразование значения пайпа¶
Каждое преобразование вызывает метод transform: первый параметр — передаваемое значение, возвращаемое значение — результат преобразования.
1 2 3 4 5 6 7 8 9 10 | |
Параметры собственного пайпа¶
Параметры преобразования добавляют дополнительными параметрами метода transform:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Обнаружение изменений внутри массивов и объектов¶
Чтобы пайп обнаруживал изменения внутри массивов или объектов, его помечают нечистой функцией: флаг pure со значением false.
Не создавайте нечистые пайпы без крайней необходимости: при неосторожном использовании они сильно бьют по производительности.
1 2 3 4 5 6 7 8 9 10 11 | |
Разработчики Angular часто добавляют Impure в name пайпа и в имя класса, чтобы предупредить коллег о возможной потере производительности.
Логика пайпа вне шаблонов¶
Пайпы — операторы шаблона для декларативного преобразования данных в шаблонах. Если та же логика нужна в сервисе, вспомогательном классе или любом другом контексте вне шаблона, не внедряйте класс пайпа. Пайпы не задуманы как внедряемые сервисы.
Вынесите логику из собственных пайпов¶
Когда создаёте собственный пайп, вынесите преобразование в отдельную функцию. Метод transform() пайпа пусть делегирует этой функции, а саму функцию импортируйте напрямую везде, где она ещё нужна.
kebab-case.ts
1 2 3 | |
kebab-case.pipe.ts
1 2 3 4 5 6 7 8 9 | |
formatter.service.ts
1 2 3 4 5 6 7 8 9 | |
formatter.service.ts
1 2 3 4 5 6 7 8 9 10 11 12 | |
Функции форматирования вместо встроенных пайпов¶
У каждого встроенного пайпа Angular, который учитывает локаль, есть соответствующая отдельная функция форматирования, экспортируемая из @angular/common. Используйте эти функции вместо внедрения класса пайпа.
| Пайп | Отдельная функция |
|---|---|
DatePipe | formatDate |
CurrencyPipe | formatCurrency |
DecimalPipe | formatNumber |
PercentPipe | formatPercent |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 | |
Источник: https://angular.dev/guide/templates/pipes