interface PipeTransform {
transform(value: any, ...args: any[]): any
}
Метод //transform// должен преобразовать входное значение. Этот метод в качестве параметра принимает значение, к которому применяется //pipe//, а также опциональный набор параметров. А на выходе возвращается отформатированное значение. Поскольку первый параметр представляет тип //any//, а второй параметр - массив типа any, то соответственно мы можем передавать данные любых типов. И также можем возвращать объект любого типа.\\
\\
Рассмотрим простейший пример. Допустим, нам надо выводить число, в котором разделителем между целой и дробной частью является запятая, а не точка. Для этого мы можем написать небольшой pipe. Для этого добавим в проект в папку **src/app** новый файл \\
**format.pipe.ts**:\\
{{ :angular:angular2:pipes:8.13.png |}}\\
\\
Определим в этом файле следующий код:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'format'
})
export class FormatPipe implements PipeTransform {
transform(value: number, args?: any): string {
return value.toString().replace(".", ",");
}
}
К кастомному pipe должен применяться декоратор Pipe. Этот декоратор определяет метаданные, в частности, название pipe, по которому он будет использоваться:
@Pipe({
name: 'format'
})
Применим FormatPipe в коде компонента:
import { Component} from '@angular/core';
@Component({
selector: 'my-app',
template: `Число до форматирования: {{x}}
Число после форматирования: {{x | format}}`
})
export class AppComponent {
x: number = 15.45;
}
Но чтобы задействовать FormatPipe, его надо добавить в главном модуле приложения AppModule:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { FormatPipe} from './format.pipe';
@NgModule({
imports: [ BrowserModule],
declarations: [ AppComponent, FormatPipe],
bootstrap: [ AppComponent ]
})
export class AppModule { }
{{ :angular:angular2:pipes:8.6.png |}}
\\
====Передача параметров====
Добавим еще один pipe, который будет принимать параметры. Пусть это будет класс, который из массива строк будет создавать строку, принимая начальный и конечный индексы для выборки данных из массива. Для этого добавим в проект новый файл join.pipe.ts, в котором определим следующее содержимое:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'join'
})
export class JoinPipe implements PipeTransform {
transform(array: any, start?: any, end?: any): any {
let result = array;
if(start!==undefined){
if(end!==undefined){
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';
@Component({
selector: 'my-app',
template: `{{users | join}}
{{users | join:1}}
{{users | join:1:3}}`
})
export class AppComponent {
users = ["Tom", "Alice", "Sam", "Kate", "Bob"];
}
Опять же подключим JoinPipe в модуле приложения:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { FormatPipe} from './format.pipe';
import { JoinPipe} from './join.pipe';
@NgModule({
imports: [ BrowserModule],
declarations: [ AppComponent, FormatPipe, JoinPipe ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Результат работы:\\
{{ :angular:angular2:pipes:8.7.png |}}