Создание своих pipes

Последнее обновление: 17.11.2023

Если нам потребуется некоторая предобработка при выводе данных, дополнительное форматирование, то мы можем для этой цели написать свои собственные pipes.

Классы pipes должны реализовать интерфейс PipeTransform

interface PipeTransform {
  transform(value: any, ...args: any[]): any
}

Метод transform должен преобразовать входное значение. Этот метод в качестве параметра принимает значение, к которому применяется pipe, а также опциональный набор параметров. А на выходе возвращается отформатированное значение. Поскольку первый параметр представляет тип any, а второй параметр - массив типа any, то соответственно мы можем передавать данные любых типов. И также можем возвращать объект любого типа.

Рассмотрим простейший пример. Допустим, нам надо выводить число, в котором разделителем между целой и дробной частью является запятая, а не точка. Для этого мы можем написать небольшой pipe. Для этого добавим в проект в папку src/app новый файл format.pipe.ts:

Custom pipe in Angular

Определим в этом файле следующий код:

import { Pipe, PipeTransform } from "@angular/core";
 
@Pipe({
    name: "format",
    standalone: true
})
export class FormatPipe implements PipeTransform {
  transform(value: number, args?: any): string {
     
    return value.toString().replace(".", ",");
  }
}

К кастомному pipe должен применяться декоратор Pipe. Этот декоратор определяет метаданные, в частности, название pipe, по которому он будет использоваться:

@Pipe({
	name: "format",
  standalone: true
})

Кроме того, чтобы можно было импортировать этот пайп в автономных компонентах, он сам определеяется как автономный.

Применим FormatPipe в коде компонента:

import { Component} from "@angular/core";
import { FormatPipe } from "./format.pipe";

@Component({
    selector: "my-app",
    standalone: true,
    imports: [FormatPipe],
    template: `<div>Число до форматирования: {{x}}<br>Число после форматирования: {{x | format}}</div>`
})
export class AppComponent { 
 
    x: number = 15.45;
}

Результат применения пайпа:

Custom pipes in Angular 17

Передача параметров

Добавим еще один pipe, который будет принимать параметры. Пусть это будет класс, который из массива строк будет создавать строку, принимая начальный и конечный индексы для выборки данных из массива. Для этого добавим в проект в папку src/app новый файл join.pipe.ts, в котором определим следующее содержимое:

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
	  name: "join",
    standalone: true
})
export class JoinPipe implements PipeTransform {
  transform(array: string[], start?: number|undefined, end?: number|undefined): any {
	let result = array;
	if(start){
		if(end){
			result = array.slice(start, end);
		}
		else{
			result = array.slice(start, result.length);
		}
	}
    return result.join(", ");
  }
}

В метод transform класса JoinPipe первым параметром передается массив, второй необязательный параметр start представляет начальный индекс, с которого производится выборка, а третий параметр end - конечный индекс.

С помощью метода slice() получаем нужную часть массива, а с помощью метода join() соединяем массив в строку.

Применим JoinPipe:

import { Component} from "@angular/core";
import { JoinPipe } from "./join.pipe";

@Component({
    selector: "my-app",
    standalone: true,
    imports: [JoinPipe],
    template: `<div>{{users | join}}</div>
			   <div>{{users | join:1}}</div>
			   <div>{{users | join:1:3}}</div>`
})
export class AppComponent { 

	users = ["Tom", "Alice", "Sam", "Kate", "Bob"];
}

Результат работы:

Передача параметров в pipe в Angular
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850