Pipes - parte 2

Olá,

Neste post vamos ver como implementar um pipe e alguns detalhes de sua implementação

Vamos criar um exemplo bem simples que irá transformar a quebra de linha (\n) em "<br />", bem simples, porém útil em muitos cenários.

Mãos à obra!

Em primeiro lugar vamos gerar o código básico do pipe através da linha de comando:

ng generate pipe <caminho/nomePipe>

ou a versão abreviada do comando

ng g p <caminho/nomePipe>

O nosso exemplo será criar o pipe dentro do módulo pipes de nossa app (github)

ng g p pipes/nl2br

este comando irá gerar o pipe e também declará-lo dentro do modulo-pipes, porém, para que o pipe seja utilizado em outros módulos temos também que exportá-lo incluindo dentro do array "exports" na configuração do módulo "pipes.module.ts"

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Nl2brPipe } from './nl2br.pipe';

@NgModule({
imports: [
CommonModule
],
declarations: [Nl2brPipe],
exports: [Nl2brPipe]
})
export class PipesModule { }

Agora vamos entender o que foi gerado no arquivo "pipes/nl2br.pipe.ts"

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

@Pipe({
name: 'nl2br'
})
export class Nl2brPipe implements PipeTransform {

transform(value: any, args?: any): any {
return null;
}

}

na linha 1 vemos os imports necessários "Pipe" e "PipeTransform" do pacote "@angular/core"
Pipe irá fornecer o decorator "@Pipe" e "@PipeTransform" contém a Interface q qual iremos implementar o método transform, aqui que a nóssa lógica deverá ser implementada.

Note que a método transforme possui o parâmetro value do tipo "any", este representa o valor que será utilizado como entrada para o pipe (ex.: {{ "texto" | nl2br }} ), já o parâmetro args é opcional, caso necessite mais parâmetros, será possivel incluí-los na sequência (ex.: transform(value:any, args?:any, args2:any[, .....]));

O decorator "@Pipe", na linha 3, possui a propriedade "name", que  tem papel semelhante a um "selector" pois será utilizado dentro do código html nos templates onde o pipe for utilizado.

Como nosso pipe implenta a interface "PipeTransform", devemos implementar o método "transform"

transform(value: any, args?: any): any {
if (value)
return value.replace(/\n/gi, '<br />\n');
return null;
}

O arquivo completo

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

@Pipe({
name: 'nl2br'
})
export class Nl2brPipe implements PipeTransform {

transform(value: any, args?: any): any {
if (value)
return value.replace(/\n/gi, '<br />\n');
return null;
}

}

para verificar o funcionamento do nosso pipe precisamos criar um compoenente dentro do módulo exemplos

ng g c exemplos/customPipe


editar o arquivo "exemplos/custom-pipe/custom-pipe.html"

<h1>Pipes</h1>
<hr>
<div class="container-fluid">
  <h2>Exemplos - custom pipe</h2>
  <table class="table">
    <thead>
      <tr>
        <th>pipe</th>
        <th>sem formatação</th>
        <th>formatado</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>nl2br</td>
        <td>{{texto}}</td>
        <td [innerHtml]="texto | nl2br"></td>
      </tr>
    </tbody>
  </table>
  <hr />
</div>

excutando a app teremos  como resultado

 

Comentar

Loading