В Angular пайпы (pipes) предназначены для преобразования данных в
шаблонах без изменения исходного объекта. Они позволяют выполнять
фильтрацию, форматирование, преобразование значений и другие операции
прямо в HTML. Помимо встроенных пайпов, таких как DatePipe,
CurrencyPipe или UpperCasePipe, фреймворк
поддерживает создание собственных пользовательских пайпов, что расширяет
возможности приложения и повышает гибкость работы с данными.
Пайп в Angular реализуется как класс, который помечается декоратором
@Pipe. Декоратор принимает объект с обязательным свойством
name, которое определяет идентификатор пайпа для
использования в шаблонах:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'examplePipe'
})
export class ExamplePipe implements PipeTransform {
transform(value: any, ...args: any[]): any {
return value;
}
}
Ключевые моменты:
PipeTransform.transform является единственным обязательным
методом и выполняет преобразование данных.value — это исходное значение, переданное
пайпу....args — дополнительные аргументы, переданные через
шаблон.Пример использования в шаблоне:
<p>{{ 'angular' | examplePipe }}</p>
Пайпы могут принимать дополнительные аргументы, которые позволяют динамически изменять поведение трансформации:
@Pipe({
name: 'multiply'
})
export class MultiplyPipe implements PipeTransform {
transform(value: number, factor: number = 1): number {
return value * factor;
}
}
Применение в шаблоне:
<p>{{ 5 | multiply:10 }}</p> <!-- Результат: 50 -->
Параметры передаются после двоеточия и могут быть любыми: числа, строки, булевы значения или даже объекты.
Angular различает чистые (pure) и нечистые (impure) пайпы:
pure: true).Пример нечистого пайпа:
@Pipe({
name: 'filterArray',
pure: false
})
export class FilterArrayPipe implements PipeTransform {
transform(items: any[], search: string): any[] {
if (!items || !search) return items;
return items.filter(item => item.toLowerCase().includes(search.toLowerCase()));
}
}
Нечистые пайпы нужно использовать осторожно, так как они могут негативно влиять на производительность приложения при большом количестве элементов.
Форматирование дат с кастомной логикой:
@Pipe({
name: 'customDate'
})
export class CustomDatePipe implements PipeTransform {
transform(value: Date | string, format: string = 'dd/MM/yyyy'): string {
const date = new Date(value);
const day = String(date.getDate()).padStart(2, '0');
const month = String(date.getMonth() + 1).padStart(2, '0');
const year = date.getFullYear();
if (format === 'yyyy-MM-dd') {
return `${year}-${month}-${day}`;
}
return `${day}/${month}/${year}`;
}
}
Фильтрация массива объектов по полю:
@Pipe({
name: 'filterByProperty'
})
export class FilterByPropertyPipe implements PipeTransform {
transform(items: any[], property: string, value: any): any[] {
if (!items || !property || value === undefined) return items;
return items.filter(item => item[property] === value);
}
}
Применение:
<li *ngFor="let user of users | filterByProperty:'role':'admin'">
{{ user.name }}
</li>
Пайп необходимо зарегистрировать в модуле приложения или в любом модуле, где предполагается его использование:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { MultiplyPipe } from './multiply.pipe';
@NgModule({
declarations: [
AppComponent,
MultiplyPipe
],
imports: [BrowserModule],
bootstrap: [AppComponent]
})
export class AppModule { }
После этого пайп доступен в любом компоненте модуля и может
применяться в шаблонах через синтаксис
{{ value | pipeName }}.
Пайпы хорошо интегрируются с RxJS и реактивными формами. Асинхронные
пайпы (AsyncPipe) позволяют подписываться на
Observable или Promise прямо в шаблоне:
<p>{{ data$ | async | customDate:'yyyy-MM-dd' }}</p>
Можно комбинировать пользовательские пайпы с AsyncPipe,
создавая мощные цепочки обработки данных без дополнительного кода в
компоненте.
Пользовательские пайпы в Angular обеспечивают чистый и удобный способ обработки данных в шаблонах, повышая читаемость кода и снижая дублирование логики. Правильное использование чистых и нечистых пайпов, а также параметров трансформации позволяет создавать гибкие и высокопроизводительные интерфейсы.