Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

CRIANDO PIPE IMPURO

OBS: por questoes de performace o time do Angular recomenda que nao sejam implementados pipes para realizar a filtragem em arrays e ordenacao de elementos, iremos implemetar apenas a nivel de exemplo para entender o conceito, porem nao deve ser implementado em projetos em producao, implementar as funcionalidades citadas anteriormente deve-se declarar diretamente no codigo (vide MANEIRA CORRETA DE ADICIONAR FILTRO NOS PROJETOS).

vamos criar um filtro para array similar ao exemplo visto em CRIANDO UM PIPE PURO, e utilizar os conceitos de heranca para herdar a interface PipeTransform da classe pipe criada anteriormente.

para tornar o pipe impuro, (para que ele escute as mudancas no argumento passado ao parametro), basta adcionar o meta-dado pure e setar como false, por padrao este meta-dado e setado como true.

Pipe:

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

import { PipePuroPipe } from './../criando-pipe-puro/pipe-puro.pipe';

@Pipe({
  name: 'filtroArrayImpuro',
  pure: false // meta-dado para tornar o pipe impuro
})
export class PipeImpuroPipe extends PipePuroPipe {

  transform(value: any, ...args: any[]): any {
    if(value.lenght === 0 || args === undefined){
      return value
    }
    
    let filro = args.toLocaleString().toLocaleLowerCase()
    
    return value.filter(
      (elementoASerComparado: string) => elementoASerComparado.toLocaleLowerCase().includes(filro)
    );
  }
}

Component:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-pipe-impuro',
  templateUrl: './pipe-impuro.component.html',
  styleUrls: ['./pipe-impuro.component.css']
})
export class PipeImpuroComponent implements OnInit {

  livros: string[] = ['Angular', 'Java']

  filtro: any

  constructor() { }

  ngOnInit(): void {
  }

  addLivro(novoLivro: string){
    this.livros.push(novoLivro)
    console.log(this.livros)
  }

}

Template do Component:

<div>
    <h3>Pipe Impuro</h3>
    <div>
        <input #inputLivro>
        <button (click)="addLivro(inputLivro.value)">Adicionar Livro</button>
    </div>
    <div>
        <input [(ngModel)]="filtro">
    </div>
    <ul>
        <li *ngFor="let livro of livros | filtroArrayImpuro:filtro">
            - 
        </li>
    </ul>
</div>


figura 1 - pipe impuro ao ser renderizado primeira vez

ao aplicar o filtro


figura 2 - pipe impuro ao aplicar o filtro

ao adcionar um novo elemento ao array com o filtro aplicado, note que a lista e atualizada.


figura 3 - pipe impuro ao adcionar novo elemento com o filtro (pipe) aplicado.