import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'format'
})
export class FormatPipe implements PipeTransform {
transform(value: number, args?: any): string {
return value.toString().replace(".", ",");
}
}
По умолчанию это pure pipe. А это значит, что он может отслеживать изменение значения, которое ему передается, так как оно представляет тип number.\\
\\
В компоненте мы могли бы динамически изменять значение, для которого выполняется форматирование:
import { Component} from '@angular/core';
@Component({
selector: 'my-app',
template: `
Результат: {{num | format}}`
})
export class AppComponent {
num: number = 15.45;
}
В файле app.module.ts подключим FormsModule, чтобы использовать двустороннюю привязку:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { FormatPipe} from './format.pipe';
import { JoinPipe } from './join.pipe';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, FormatPipe, JoinPipe],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Здесь никаких проблем с вводом бы не возникло - изменяем число в текстовом поле, и тут же изменяется форматируемый результат:
{{ :angular:angular2:8.8.png |}}
Но в прошлой теме был также создан другой pipe:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'join'
})
export class JoinPipe implements PipeTransform {
transform(array: any, start?: any, end?: any): any {
return array.join(", ");
}
}
Этот pipe производит операции над массивом. Соответственно если в компоненте динамически добавлять новые элементы в массив, к которому применяется JoinPipe, то мы не увидим изменений. Так как JoinPipe не будет отслеживать изменения над массивом.\\
\\
Теперь сделаем его impure pipe. Для этого добавим в декоратор Pipe параметр pure: false:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'join',
pure: false
})
export class JoinPipe implements PipeTransform {
transform(array: any, start?: any, end?: any): any {
return array.join(", ");
}
}
По умолчанию параметр pure равен true.\\
\\
Теперь мы можем добавлять в компоненте новые элементы в этот массив:
import { Component} from '@angular/core';
@Component({
selector: 'my-app',
template: `
{{users | join}}
`
})
export class AppComponent {
users = ["Tom", "Alice", "Sam", "Kate", "Bob"];
}
И ко всем добавленным элементам также будет применяться JoinPipe:
{{ :angular:angular2:8.9.png |}}
Когда добавляется новый элемент, класс JoinPipe заново начинает обрабатывать массив. Поэтому pipe применяется ко всем элементам.