Pipes (пайпы) - это специальные инструменты в Angular для трансформации данных прямо в шаблоне. Они позволяют форматировать или преобразовывать отображаемые значения без изменения исходных данных.
|
Angular предоставляет набор встроенных пайпов:
<!-- Дата -->
```{{ today | date:'dd.MM.yyyy' }}```
<!-- Текст -->
```{{ message | uppercase }}```
```{{ longText | truncate:20 }}``` <!-- Предполагая кастомный пайп -->
<!-- Числа -->
```{{ price | currency:'USD':'symbol':'1.2-2' }}```
```{{ percentValue | percent }}```
<!-- JSON (для отладки) -->
```{{ object | json }}```
ng generate pipe truncate
или вручную:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'truncate',
pure: true // опционально, true по умолчанию
})
export class TruncatePipe implements PipeTransform {
transform(value: string, limit: number = 50, completeWords: boolean = false, ellipsis: string = '...'): string {
if (!value) return '';
if (value.length <= limit) {
return value;
}
if (completeWords) {
limit = value.substr(0, limit).lastIndexOf(' ');
}
return `${value.substr(0, limit)}${ellipsis}`;
}
}
Пайп автоматически добавляется в declarations
модуля, где был сгенерирован.
```{{ longText | truncate:20:true:'...' }}```
Pure (по умолчанию):
Impure:
Пример impure пайпа:
@Pipe({
name: 'filterArray',
pure: false
})
export class FilterArrayPipe implements PipeTransform {
transform(items: any[], filter: string): any {
if (!items || !filter) return items;
return items.filter(item => item.name.includes(filter));
}
}
Пайпы могут принимать несколько параметров:
```{{ value | myPipe:param1:param2:param3 }}```
В реализации пайпа:
transform(value: any, param1: any, param2: any, param3: any): any {
// Логика преобразования
}
@Pipe({ name: 'phoneFormat' })
export class PhoneFormatPipe implements PipeTransform {
transform(phone: string, countryCode: string = '+7'): string {
if (!phone) return '';
const cleaned = phone.replace(/\D/g, '');
if (cleaned.length === 10) {
return `${countryCode} (${cleaned.substring(0, 3)}) ${cleaned.substring(3, 6)}-${cleaned.substring(6, 8)}-${cleaned.substring(8)}`;
}
return phone;
}
}
Использование:
```{{ user.phone | phoneFormat:'+7' }}```
Пример теста для TruncatePipe:
describe('TruncatePipe', () => {
let pipe: TruncatePipe;
beforeEach(() => {
pipe = new TruncatePipe();
});
it('should truncate string', () => {
expect(pipe.transform('1234567890', 5)).toBe('12345...');
});
it('should handle empty string', () => {
expect(pipe.transform('', 5)).toBe('');
});
});
@Pipe
декоратор и реализуют PipeTransform